BeanFactory的默认实现为DefaultListableBeanFactory,Bean生命周期和方法映射如下
BeanDefinition注册阶段:registerBeanDefinition
BeanDefinition合并阶段:getMergedBeanDefinition
Bean实例化前阶段:resolveBeforeInstantiation
Bean实例化阶段:createBeanInstance
Bean实例化后阶段:populateBean
Bean属性赋值前阶段:populateBean
Bean属性赋值阶段:populateBean
Bean Aware接口回调阶段:initializeBean
Bean初始化前阶段:initializeBean
Bean初始化阶段:initializeBean
Bean初始化后阶段:initializeBean
Bean初始化完成阶段:preInstantiateSingletons
Bean销毁前阶段:destoryBean
Bean销毁阶段:destoryBean
Bean的创建过程涉及2个名词
实例化(Instantiation):还没有生成bean
初始化(Initialization):已经生成bean,进行属性赋值
BeanPostProcessor
postProcessBeforeInitialization:初始化前置处理
postProcessAfterInitialization:初始化后置处理
InstantiationAwareBeanPostProcessor(继承自BeanPostProcessor)
postProcessBeforeInstantiation:实例化前置处理(对象未生成)返回不为null,只是放到spring容器中,依赖关系不由spring来处理
postProcessAfterInstantiation:实例化后置处理(对象已生成)
postProcessPropertyValues:修改属性值(对象已生成)
SmartInstantiationAwareBeanPostProcessor(继承自InstantiationAwareBeanPostProcessor)
predictBeanType:预测bean的类型,返回第一个预测成功的Class类型,如果不能预测返回null
determineCandidateConstructors:选择合适的构造器并返回,因为一个类可能有多个构造器
getEarlyBeanReference:获得提前暴露的bean引用。主要解决循环依赖的问题
MergedBeanDefinitionPostProcessor(继承自BeanPostProcessor)
postProcessMergedBeanDefinition:完成对象最基础的实例化工作,对@Autowired和@Value的支持,init方法执行
bean的构造方法
BeanPostProcessor的postProcessBeforeInitialization方法
执行被@PostConstruct修饰的方法
BeanPostProcessor的postProcessAfterInitialization方法
实例化前阶段
InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation()
返回不为空的说明,bean已经在这个方法中创建好了,不需要再进行后续的处理了
SmartInstantiationAwareBeanPostProcessor#determineCandidateConstructors()
不做特殊处理的话容器中目前有一个(ConfigurationClassPostProcessor$ImportAwareBeanPostProcessor)
返回合适的构造器,默认返回为null
实例化阶段
实例化后阶段
MergedBeanDefinitionPostProcessor#postProcessMergedBeanDefinition()
解析@Autowired和@Value,为后续的依赖注入作准备
SmartInstantiationAwareBeanPostProcessor#getEarlyBeanReference()
getEarlyBeanReference主要用于解决循环引用问题。比如ReferenceA实例内部有ReferenceB的引用,ReferenceB实例内部有ReferenceA的引用。首先先实例化ReferenceA,实例化完成之后提前把这个bean暴露在ObjectFactory中,然后populate属性,这个时候发现需要ReferenceB。然后去实例化ReferenceB,在实例化ReferenceB的时候它需要ReferenceA的实例才能继续,这个时候就会去ObjectFactory中找出了ReferenceA实例,ReferenceB顺利实例化。ReferenceB实例化之后,ReferenceA的populate属性过程也成功完成,注入了ReferenceB实例。提前把这个bean暴露在ObjectFactory中,这个ObjectFactory获取的实例就是通过getEarlyBeanReference方法得到的
InstantiationAwareBeanPostProcessor#postProcessAfterInstantiation()
对象已经被实例化,该实例的属性还未被设置,都是null。该方法返回false,会忽略属性值的设置。返回true,会按正常流程设置属性值
InstantiationAwareBeanPostProcessor#postProcessPropertyValues()
当InstantiationAwareBeanPostProcessor#postProcessAfterInstantiation()返回true才执行
对属性值进行修改
属性赋值前阶段
属性赋值阶段
Aware接口回调阶段
BeanNameAware
BeanClassLoaderAware
BeanFactoryAware
EnvironmentAware
ResourceLoaderAware
ApplicationEventPublisherAware
MessageSourceAware
ApplicationContextAware
初始化前阶段
BeanPostProcessor#postProcessBeforeInitialization()
在Bean初始化之前需要调用的方法
初始化阶段
依次调用如下方法:
初始化后阶段
在Bean初始化之后需要调用的对象
BeanPostProcessor#postProcessAfterInitialization()
销毁前阶段
销毁阶段
依次调用如下方法:
原来的spring mvc项目是tomcat扫描web.xml初始化spring容器,现在是在main方法中初始化spring容器,并且创建tomcat环境,将DispatcherServlet注册到tomcat中
动态代理
具体过程
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsBeforeInstantiation
InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#determineConstructorsFromBeanPostProcessors
SmartInstantiationAwareBeanPostProcessor#determineCandidateConstructors
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#applyMergedBeanDefinitionPostProcessors
MergedBeanDefinitionPostProcessor#postProcessMergedBeanDefinition
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#getEarlyBeanReference
SmartInstantiationAwareBeanPostProcessor#getEarlyBeanReference
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#populateBean
InstantiationAwareBeanPostProcessor#postProcessAfterInstantiation
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#populateBean
InstantiationAwareBeanPostProcessor#postProcessPropertyValues
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsBeforeInitialization
BeanPostProcessor#postProcessBeforeInitialization
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsAfterInitialization
BeanPostProcessor#postProcessAfterInitialization
bean被销毁的时候
BeanPostProcessor贯穿了bean的初始化过程(bean已经new出来,并且完成属性的填充),自动装配
在new出来之前还执行了一些BeanPostProcessor
[1]https://mp.weixin.qq.com/s/gBr3UfC1HRcw4U-ZMmtRaQ
循环依赖解决办法
[0]https://juejin.im/post/5c98a7b4f265da60ee12e9b2
好的博客
[0]https://fangjian0423.github.io/2017/06/20/spring-bean-post-processor/
大概流程
[1]https://editor.csdn.net/md?articleId=104781542
名词介绍
[2]https://juejin.im/post/5da995d25188256a49204d7b