Spring Bean的生命周期

一、整体流程

1、实例化BeanPostFactoryProcessor

2、执行BeanPostFactoryProcessor 的 postProcessorBeanFactory

3、实例化BeanPostProcessor

4、实例化InstantiationAwareBeanPostProcessor

5、执行InstantiationAwareBeanPostProcessor 的 PostProcessorBeforeInstantiation

6、执行bean的构造方法

7、执行InstantiationAwareBeanPostProcessor 的 postProcessorPropertyValues

8、bean 属性注入

9、执行BeanNameAware的setBeanName

10、执行BeanFactoryAware的setBeanFactory

11、执行BeanPostProcessor的PostProcessorBeforInstantiation

12、执行InitializingBean的afterPropertisSet

13、执行<bean> 的init-methord

14执行postBeanProecssor的PostProcessorAfterInitantiation

15、容器初始化完成后,执行调用方法

16、执行diposibleBean 的destroy方法

17、执行<bean>的destroy_method方法

二、各个方法

1、Spring IoC容器允许BeanFactoryPostProcessor在容器实例化任何bean之前读取bean的定义(配置元数据),并可以修改它。同时可以定义多个BeanFactoryPostProcessor,通过设置'order'属性来确定各个BeanFactoryPostProcessor执行顺序。

   注册一个BeanFactoryPostProcessor实例需要定义一个Java类来实现BeanFactoryPostProcessor接口,并重写该接口的postProcessorBeanFactory方法。通过beanFactory可以获取bean的定义信息,并可以修改bean的定义信息。这点是和BeanPostProcessor最大区别

2、 如果我们想在Spring容器中完成bean实例化、配置以及其他初始化方法前后要添加一些自己逻辑处理。我们需要定义一个或多个BeanPostProcessor接口实现类,然后注册到Spring IoC容器中。

BeanPostProcessor接口中有2个方法

(1).Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException;

(2).Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException;
 

由API可以看出:
1:后置处理器的postProcessorBeforeInitailization方法是在bean实例化,依赖注入之后及自定义初始化方法(例如:配置文件中bean标签添加init-method属性指定Java类中初始化方法、
@PostConstruct注解指定初始化方法,Java类实现InitailztingBean接口)之前调用
2:后置处理器的postProcessorAfterInitailization方法是在bean实例化、依赖注入及自定义初始化方法之后调用

 

3、InstantiationAwareBeanPostProcessor中除了上述的两个方法外还有本身接口的方法

(1).Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException;

(2).boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException;

(3).PropertyValues postProcessPropertyValues(
            PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName)

            throws BeansException;

postProcessBeforeInstantiation方法

这个方法在bean实例化之前被调用,返回的对象可能是代替了目标对象的代理对象,有效的阻止了目标bean默认的实例化。也就是说,如果该方法返回的是non-null对象 ,这个bean的创建过程就会被短路,就不会执行postProcessAfterInitialization的方法和postProcessPropertyValues方法; 相反的如果方法返回值为null,则会继续默认的bean的实例化过程

InstantiationAwareBeanPostProcessor的postProcessBeforeInstantiation方法如果返回不为空,整个对象的创建的过程就结束了,否则会执行这个bean正常的实例化过程

postProcessAfterInstantiation方法

这个方法在bean实例化(通过构造函数或者是工厂方法[via a constructor or factory method])之后被调用,但是在bean属性注入(property population)之前,如果方法返回值为true,则说明会在这个bean设置属性方法,即调用postProcessPropertyValues方法。返回false,则会跳过对象bean属性设置过程。一般的,实现类需要返回true,如果返回false,也阻止了其他InstantiationAwareBeanPostProcessor子类作用在bean的影响

 

postProcessPropertyValues方法

这个方法通常是给目标bean设值,这个过程发生只有在postProcessAfterInstantiation方法的结果返回true才会被执行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值