Spring Bean生命周期简图
流程图
Aware接口分类
Aware Group1
BeanNameAware
BeanClassLoaderAware
BeanFactoryAware
Aware Group2
EnvironmentAware
EmbeddedValueResolverAware //该接口能够获取Spring EL解析器,用户的自定义注解需要支持spel表达式的时候可以使用,非常方便
ApplicationContextAware
//ApplicationContext复合接口
public interface ApplicationContext extends EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory,
MessageSource, ApplicationEventPublisher, ResourcePatternResolver {}
getBean大致调用栈
getBean
doGetBean
//先到缓存中(共三级,依次获取直到不为null为止),获取到sharedInstance
//sharedInstance可能不是目标对象(可能是用来创建目标对象的工厂对象)
//继续调用getObjectForBeanInstance获取真正的目标对象
sharedInstance= getSingleton(beanName)
beanInstance = getObjectForBeanInstance(sharedInstance,..)
//当前缓存中没有目标bean,尝试到父容器中获取bean
getParentBeanFactory().getBean()
//没有父容器或父容器中没有这个bean,则分析依赖,依次对所有依赖的bean循环调用getBean
mbd.getDependsOn() -> registerDependentBean ——> getBean
//被依赖的所有bean构建完成后,再调用getSingleton(beanName,objectFactory)来构建目标bean
getSingleton(beanName, () -> createBean(beanName, mbd, args))
//createBean是回调函数,构建目标bean的核心在此
createBean
// 循环调用所有的InstantiationAwareBeanPostProcessor,
// 方法返回值不为null就直接这个bean. AOP实现关键在此
resolveBeforeInstantiation
doCreateBean
//调用工厂方法(实现了FactoryBean接口或配置了工厂方法)或
//反射调用构造方法(可能是无参的,也可能是有参的)实例化目标bean
createBeanInstance
//允许MergedBeanDefinitionPostProcessor后处理器修改bean定义
//如@Autowire ApplicationListenerDetector等
applyMergedBeanDefinitionPostProcessors
//如果允许早期暴露,将单例工厂缓存起来,这是实现循环依赖的关键
addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean))
populateBean
//属性填充前,修改bean的状态,如基于字段的属性注入(不依赖于setter方法)
InstantiationAwareBeanPostProcessor#postProcessAfterInstantiation
//基于名字和类型的自动注入,这跟@Autowire注解没有任何关系,
//可在xml中配置 autowire="byName|byType"
autowireByName//基于名字的自动注入
autowireByType//基于类型的自动注入
//主要是各种@Autowire等注解方式的属性注入
InstantiationAwareBeanPostProcessor#postProcessPropertyValues
checkDependencies//检查依赖,可能抛出异常
applyPropertyValues //将属性的值应用到目标bean
initializeBean
//BeanNameAware BeanClassLoaderAware
//BeanFactoryAware 这三类aware函数接口依次调用
invokeAwareMethods(beanName, bean);
//调用所有后处理器的初始化前方法
applyBeanPostProcessorsBeforeInitialization
BeanPostProcessor#postProcessBeforeInitialization
//先执行InitializingBean#afterPropertiesSet接口方法
//再执行自定义的Init方法(xml中init-method指定的这类方法)
invokeInitMethods(beanName, wrappedBean, mbd);
// 调用所有后处理器的初始化后方法
applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
BeanPostProcessor#postProcessAfterInitialization
//如果允许早期暴露,还将调用getSingleton(beanName, false),此方法最多到二级缓存
//中获取 bean,不会有第三级缓存中获取bean
getSingleton(beanName, false);
//注册bean销毁方法
registerDisposableBeanIfNecessary()
//DisposableBeanAdapter将所有销毁方法合并有一起,
//放在自己的destroy中循环遍历依次调用。它很好的诠释了适配器模式
//先调用DestructionAwareBeanPostProcessor,再调用DisposableBean,最后调用自定义销毁方法
registerDisposableBean(DisposableBeanAdapter disposableBeanAdapter)
最后方法返回