bean的生命周期
1 . 首先容器启动后,对bean进行初始化
2 . 按照bean的定义,注入属性
3 . 检测该对象是否实现了xxxAware接口,并将相关的xxxAware实例注入给bean,如BeanNameAware等
4 . 以上步骤,bean对象已正确构造,通过实现BeanPostProcessor接口,可以再进行一些自定义方法处理。如:postProcessBeforeInitialzation。
5 . BeanPostProcessor的前置处理完成后,可以实现postConstruct,afterPropertiesSet,init-method等方法,增加我们自定义的逻辑,
6 . 通过实现BeanPostProcessor接口,进行postProcessAfterInitialzation后置处理
7 . 接着Bean准备好被使用啦。
8 . 容器关闭后,如果Bean实现了DisposableBean接口,则会回调该接口的destroy()方法
通过给destroy-method指定函数,就可以在bean销毁前执行指定的逻
总结起来就是首先看bean是不是需要使用spring上下文,如果需要,就去实现各个aware,得到beanName,或者beanFactory,applicationContext。
然后,有一个beanPostProcessor,围绕着bean初始化前后提供方法。
bean的初始化:@postConstruct,实现InitalizeBean,init-method。
注意:BeanPostProcessor是一个工厂钩子。普通Bean对象的工厂允许在程序中注册post-processors,应用到随后在本工厂中创建的所有Bean上。
也就是说,配置了实现BeanPostProcessor接口的bean,会影响所有随后创建的bean的初始化,但是这个bean本身并不会受到影响。
- Spring BeanNameAutoProxyCreator代理后会丢失target bean方法上的注解
- 代理通过BeanPostProcessors进行,多个BeanPostProcessors的执行顺序可能存在随机性,需要使用Ordered注解。
- 最好不要混用多个BeanPostProcessor对同个bean进行代理(这个确实不好做好,因为有可能其他人在框架或者二方包中进行了代理)
- BeanPostProcessor的执行时机:在bean实例化之后、初始化前后被执行,允许我们对bean实例进行自定义的修改
- spring中有很多BeanPostProcessor的实现,我们接触的比较多的自动装配:AutowiredAnnotationBeanPostProcessor也是BeanPostProcessor的实现之一