Spring

作者: 16325 | 来源:发表于2020-02-19 09:39 被阅读0次

    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的实现之一

    相关文章

      网友评论

          本文标题:Spring

          本文链接:https://www.haomeiwen.com/subject/uivofhtx.html