生命周期
image.png- 初始化bean实例,无参数AbstractAutowireCapableBeanFactory#createBean()
- 设置属性(涉及到循环依赖)
- 如果Bean类实现BeanNameAware接口,则将通过传递Bean的名称来调用setBeanName()方法。
如果Bean类实现BeanClassLoaderAware接口,则将通过传递加载此Bean的ClassLoader对象的实例来调用setBeanClassLoader()方法。
如果Bean类实现BeanFactoryAware接口,则将通过传递BeanFactory对象的实例来调用setBeanFactory()方法。 - 如果有任何与BeanFactory关联的BeanPostProcessors对象已加载Bean,则将在设置Bean属性之前调用applyBeanPostProcessorsBeforeInitialization()方法。
- 如果Bean类实现了InitializingBean接口,则在设置了配置文件中定义的所有Bean属性后,将调用afterPropertiesSet()方法。
如果配置文件中的Bean定义包含init-method属性,则该属性的值将解析为Bean类中的方法名称,并将调用该方法。 - 调用beanPostProcess的applyBeanPostProcessorsAfterInitialization方法
- 销毁
循环依赖
循环依赖简单流程- beanA进行初始化,并且将自己进行初始化的状态记录下来,添加入singletonFactories,从而使其他bean能引用到该bean
- beanA中有beanB的依赖,于是开始初始化beanB。
- 初始化beanB的过程中又发现beanB依赖了beanA,于是又进行beanA的初始化,这时发现beanA已经在进行初始化了,程序发现了存在的循环依赖,然后通过步骤一中暴露的singletonFactories拿到beanA的引用(注意,此时的beanA只是完成了构造函数的注入但为完成其他步骤),从而beanB拿到beanA的引用,完成注入,完成了初始化,如此beanB的引用也就可以被beanA拿到,从而beanA也就完成了初始化。
spring进行bean的加载的时候,首先进行bean的初始化(调用构造函数),然后进行属性填充。在这两步中间,spring对bean进行了一次状态的记录,也就是说spring会把指向只完成了构造函数初始化的bean的引用通过一个变量记录下来.
网友评论