美文网首页
spring生命周期及循环依赖问题

spring生命周期及循环依赖问题

作者: hcq0514 | 来源:发表于2020-03-17 16:29 被阅读0次

    生命周期

    image.png
    1. 初始化bean实例,无参数AbstractAutowireCapableBeanFactory#createBean()
    2. 设置属性(涉及到循环依赖)
    3. 如果Bean类实现BeanNameAware接口,则将通过传递Bean的名称来调用setBeanName()方法。
      如果Bean类实现BeanClassLoaderAware接口,则将通过传递加载此Bean的ClassLoader对象的实例来调用setBeanClassLoader()方法。
      如果Bean类实现BeanFactoryAware接口,则将通过传递BeanFactory对象的实例来调用setBeanFactory()方法。
    4. 如果有任何与BeanFactory关联的BeanPostProcessors对象已加载Bean,则将在设置Bean属性之前调用applyBeanPostProcessorsBeforeInitialization()方法。
    5. 如果Bean类实现了InitializingBean接口,则在设置了配置文件中定义的所有Bean属性后,将调用afterPropertiesSet()方法。
      如果配置文件中的Bean定义包含init-method属性,则该属性的值将解析为Bean类中的方法名称,并将调用该方法。
    6. 调用beanPostProcess的applyBeanPostProcessorsAfterInitialization方法
    7. 销毁

    循环依赖

    循环依赖简单流程
    1. beanA进行初始化,并且将自己进行初始化的状态记录下来,添加入singletonFactories,从而使其他bean能引用到该bean
    2. beanA中有beanB的依赖,于是开始初始化beanB。
    3. 初始化beanB的过程中又发现beanB依赖了beanA,于是又进行beanA的初始化,这时发现beanA已经在进行初始化了,程序发现了存在的循环依赖,然后通过步骤一中暴露的singletonFactories拿到beanA的引用(注意,此时的beanA只是完成了构造函数的注入但为完成其他步骤),从而beanB拿到beanA的引用,完成注入,完成了初始化,如此beanB的引用也就可以被beanA拿到,从而beanA也就完成了初始化。

    spring进行bean的加载的时候,首先进行bean的初始化(调用构造函数),然后进行属性填充。在这两步中间,spring对bean进行了一次状态的记录,也就是说spring会把指向只完成了构造函数初始化的bean的引用通过一个变量记录下来.

    相关文章

      网友评论

          本文标题:spring生命周期及循环依赖问题

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