Spring

bean的生命周期

image.png

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的实现之一
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容