下图显示了beanfactory bean生命周期的完整流程
步骤:
1 .当调用方通过getBean(beanname )向容器请求bean时,请在容器中单击org.spring framework.beans.factory.config.instantiational award
2 .根据配置调用Bean构造函数或工厂方法实例化Bean
.如果在容器中注册了org.spring framework.beans.factory.config.instantiationawarebeanpostprocessor接口,则在实例bean之后
如果仔细观察,您会发现1和3是同一个instantiationawarebeanpostprocessor接口。 但是,调用方法一个是postProcessBeforeInstantiation (一个是postprocessafterinstantion ),据说一个before和一个after前后,分别实例化bean
4. postProcessBeforeInstantiation方法。
因此,我们还发现,在与1、3相同的接口上,只是改变了postProcessPropertyValues这一方法,就字面上与属性有关,是设置属性前的操作
5 .设定属性值
6 .如果bean实现了org.spring framework.beans.factory.beanname aware接口,则调用bean的setBeanName )方法并传递bean的ID
设置属性后,首先在BeanNameAware的setBeanName ()方法中设置bean名称。
如果Bean实现了org.spring framework.beans.factory.beanfactory aware接口,则调用setBeanFactory ()方法将其传递给工厂本身。
然后,使用BeanFactoryAware的setBeanFactory ()方法设置bean实例。
8 如果Bean配置了属性信息,在设置每个属性之前将调用InstantiationAwareBeanPostProcess接口的postProcessPropertyValues()
这同样是对bean的处理,是BeanPostProcessor接口的postProcessBeforeInitialzation ()方法。
如果bean实现了InitializingBean接口,则将调用afterPropertiesSet ()方法
InitializingBean接口的afterPropertiesSet ()方法
10 .如果bean指定了init-method方法,则将调用它。
初始化方法
11 .如果存在beanpsotprocessor和bean之间的关联,则会调用这些postProcessAfterInitialization ()方法。 此时,Bean可以在APP应用程序系统中使用。
对应于8,是另一个前后,一个before和一个after
如果在12-a.bean中将该bean的范围指定为scope='prototype ',则bean的调用者和调用者将管理该bean的生命周期,而spring则不管理该bean。
如果spring不管理此bean,则scope='prototype ',其中12是分支,可能有两种情况
如果bean指定12-b.bean的范围为scope='singleton ',则将该bean放入springIOC缓存池将触发该bean的spring生命周期管理
spring管理此bean的是scope='singleton ',其中12是分支,可能有两种情况
如果13-a.bean实现了DisposableBean接口,则调用afterPropertiesSet () (方法)。
14-a .直接用destroy-method销毁
14
-b 这个bean自己的管理者如何销毁,spring不管。注意点:
注意两个单词
单词含义Instantiation表示实例化,对象还未生成Initialization表示初始化,对象已经生成重点:
BeanPostProcessor也称为Bean后置处理器,它是Spring中定义的接口,在Spring容器的创建过程中(具体为Bean初始化前后)会回调BeanPostProcessor中定义的两个方法。
实现了BeanPostProcessor接口,在spring 容器中注册bean后,会自动应用在容器中。在所有Bean实例化之后进行前后作用。
BeanPostProcessor --- 又被称为 :统一处理器 的作用
Spring在IOC容器完成bean的实例化、配置和初始化后可以通过BeanPostProcessor(后处理器)对创建的bean进行各种处理。你可以在这里修改bean的属性或者增强bean,spring AOP创建jdk代理或者cglib代理的过程就是在BeanPostProcessor(后处理器)中实现的。因此我将Spring AOP 技术看做是:Spring AOP = BeanPostProcessor + 代理。
BeanPostProcessor的作用域范围是容器级的。它只和你所使用的容器有关。如果你在容器中定义一个实现了BeanPostProcessor的类,它仅仅对此容器中的bean进行后置处理。
如果配置了多个BeanPostProcessor,那么可以通过实现Ordered接口设置'order'属性来控制BeanPostProcessor的执行次序。
总结:
Bean的完整生命周期从 spring 容器开始实例化 bean 开始,到销毁。可以从三点来理解
1、 bean自身的方法:包括构造方法、 set 方法、 init-method 指定的方法、 destroy-method 指定的方法
2、 Bean级生命周期接口方法:如 BeanNameAware 、 BeanFactoryAware 等这些接口方法由 bean类实现。
3、 容器级生命周期接口方法:上图中带星的。有InstantiationAwareBeanPostProcessor 、 BeanPostProcessor 等。一般称为后处理 器。他们一般不由bean 本身实现,独立存在,注册到 spring 容器中。 Spring 通过接口反射预先知道,当 spring 容器创建任何 bean 时,这些后处理器都会发生作用。所以他们是全局的,用户可以通过编码对只感兴趣的 bean 进行处理。
Bean级生命周期接口和容器级生命周期接口是个性和共性辩证统一的思想,前者解决 bean 的个性化处理问题,而后者解决容器中某些 bean 共性化处理问题。
参考:https://www.cnblogs.com/jing-daye/p/5469068.html