Spring生命周期拓展点-造组件必备

Spring Bean的生命周期指的是Bean从创建到初始化再到销毁的过程,这个过程由IOC容器管理。

在整个生命周期过程中,我们可以自定义Bean的初始化和销毁钩子函数,当Bean的生命周期到达相应的阶段的时候,Spring会调用我们自定义的Bean的初始化和销毁方法。

初始化可以通过实现InitializingBean接口或@PostConstruct注解

而Bean销毁可以实现DisposableBean接口

这些都是spring生命周期中最基础最常见的,但是还有更细的拓展点如: BeanPostProcessor、InstantiationAwareBeanPostProcessor、BeanFactoryPostProcessor 、BeanDefinitionRegistryPostProcessor这些是spring留给我们的口子,用于开发更好的去自定义自己的需求,下面来详细介绍一下,按照spring注入IOC顺序进行讲解。

BeanDefinitionRegistryPostProcessor继承自BeanFactoryPostProcessor,新增了一个postProcessBeanDefinitionRegistry方法。

postProcessBeanDefinitionRegistry方法的执行时机为:所有的Bean定义即将被加载,但Bean的实例还没被创建时。也就是说,BeanDefinitionRegistryPostProcessor的postProcessBeanDefinitionRegistry方法执行时机先于BeanFactoryPostProcessor的postProcessBeanFactory方法。这个方法通常用于给IOC容器添加额外的组件。

BeanFactoryPostProcessor的接口方法为postProcessBeanFactory,执行时机为:BeanFactory标准初始化之后,所有的Bean定义已经被加载,但Bean的实例还没被创建(不包括BeanFactoryPostProcessor类型)。该方法通常用于修改bean的定义,Bean的属性值等,甚至可以在此快速初始化Bean。

 

InstantiationAwareBeanPostProcessor

  • postProcessBeforeInstantiation(Class<?> beanClass, String beanName):beanClass:待实例化的Bean类型;beanName:待实例化的Bean名称。方法作用为:在Bean实例化前调用该方法,返回值可以为代理后的Bean,以此代替Bean默认的实例化过程。返回值不为null时,后续只会调用BeanPostProcessor的 postProcessAfterInitialization方法,而不会调用别的后续后置处理方法(如postProcessAfterInitialization、postProcessBeforeInstantiation等方法);返回值也可以为null,这时候Bean将按默认方式初始化。
  • postProcessAfterInstantiation(Object bean, String beanName):bean:实例化后的Bean,此时属性还没有被赋值;beanName:Bean名称。方法作用为:当Bean通过构造器或者工厂方法被实例化后,当属性还未被赋值前,该方法会被调用,一般用于自定义属性赋值。方法返回值为布尔类型,返回true时,表示Bean属性需要被赋值;返回false表示跳过Bean属性赋值,并且InstantiationAwareBeanPostProcessor的postProcessProperties方法不会被调用。
  • postProcessProperties(PropertyValues pvs, Object bean, String beanName):在Bean属性赋值后调用该方法并且postProcessAfterInstantiation返回值必须为true。

BeanPostProcessor

  • postProcessBeforeInitialization(Object bean, String beanName):bean:Bean实例;beanName:Bean名称。方法将在Bean实例的afterPropertiesSet方法或者自定义的init方法被调用前调用,此时Bean属性已经被赋值。方法返回原始Bean实例或者包装后的Bean实例,如果返回null,则后续的后置处理方法不再被调用。
  • postProcessAfterInitialization(Object bean, String beanName):bean:Bean实例;beanName:Bean名称。方法将在Bean实例的afterPropertiesSet方法或者自定义的init方法被调用后调用,此时Bean属性已经被赋值。方法返回原始Bean实例或者包装后的Bean实例,如果返回null,则后续的后置处理方法不再被调用。

总结来说在Bean工厂初始化DI的生命周期中执行顺序是:

1、在bean定义即将被加载时执行postProcessBeanDefinitionRegistry方法(我们可以利用此拓展点给ioc添加额外的组件)

2、在bean定义全部加载后(未创建实例)执行postProcessBeanFactory方法(可以修改bean定义,属性值等)。

3、在bean实例化之前执行postProcessBeforeInstantiation方法(返回值可以为代理后的Bean,以此代替Bean默认的实例化过程

4、在bean实例化后,未属性赋值前执行postProcessAfterInstantiation方法(一般用于自定义属性赋值

5、在bean实例赋值属性后执行postProcessProperties方法

6、在bean实例将在afterPropertiesSet方法或者自定义的init方法被调用前调用postProcessBeforeInitialization方法

7、bean实例开始执行@PostConstruct、afterPropertiesSet、init方法对bean进行最后的初始化操作

8、在bean执行完afterPropertiesSet方法或者自定义的init方法后调用postProcessAfterInitialization方法

具体源码资料可以参考这篇文章:源码解析

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值