前言:记得20年年初在B站上看过Bean的生命周期的视频,最近实习到了尾期,想准备一下面试,就看了一下这部分的内容,发现网上博客各个版本都有,与之前看视频的讲解也是不一样的。所以只能自己看一下源码,做此笔记。
先理清下面两个单词吧
Instantiate: 实例化 ,java中表现为 new 构造方法 或 反射形式等…
Initialization:初始化 ,初始化就是给变量一个初始值
生命周期
Bean的生命周期总的来说只有四个。实例化,属性填充,初始化和销毁。
而BeanPostProcessor
及其子接口 InstantiationAwareBeanPostProcessor
就是在这生命周期的不同阶段之间做增强的。
在AbstractAutowireCapableBeanFactory # createBean
具体细分为下面的流程
注意:有的Bean只需要经过 BeforeInstantiation 和 postProcessAfterInitialization 这两个处理点就可以直接到就绪状态,这个也是aop实现原理,后面会另开一篇写。
文字描述
BeanDefinition:bean的定义信息。
BeforeInstantiation:Give BeanPostProcessors a chance to return a proxy instead of the target bean instance. 允许实现InstantiationAwareBeanPostProcessor
接口的bean 通过postProcessBeforeInstantiation
方法做特殊处理返回一个代理对象。
Instantiate:实例化bean
modify bean definition:允许MergedBeanDefinitionPostProcessor
对bean定义信息修改。
AfterInstantiation:实例化后置增强。允许实现InstantiationAwareBeanPostProcessor
接口的bean通过postProcessAfterInstantiation
方法决定是否需要调用接口的postProcessProperties
方法,若返回值为false,那么后续的postProcessProperties
和图里的autowire 、applyPropertyValues就直接跳过了。
autowire:根据BeanDefinition
的autowireMode
注入属性值。
applyPropertyValues:根据InstantiationAwareBeanPostProcessor
接口的postProcessProperties
返回值设置属性值。
invokeAwareMethods: 如果bean是一个BeanNameAware
,调用其setBeanName
;如果bean是一个BeanClassLoaderAware
调用其setBeanClassLoader
方法,如果bean是一个BeanFactoryAware
,调用其setBeanFactory
方法设置当前工厂。
postProcessBeforeInitialization:初始化前增强。允许BeanPostProcessor
通过postProcessBeforeInitialization
方法对bean进行增强。
invokeInitMethods:对于实现InitializingBean
接口的bean,调用其afterPropertiesSet
方法初始化bean。调用自定义的init
方法。进行bean的初始化。
postProcessAfterInitialization:初始化后增强。允许BeanPostProcessor
通过postProcessAfterInitialization
方法对bean进行增强。
registerDisposableBean:如果是单例bean,往beanFactory的disposableBeans
添加。注册bean的destroy
方法。
从上面的文字描述可以看出BeanPostProcessor
和InstantiationAwareBeanPostProcessor
接口是对所有的bean的生效的,而
Aware
接口是对单个bean生效的。
源码分析
下面还是开始看源码吧。就按照第三张=图的流程来分析源码。
BeforeInstantiation
先看看AbstractAutowireCapableBeanFactory #createBean
方法
// 已删除无关代码
protected Object createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)
throws BeanCreationException {
try {
// Give BeanPostProcessors a chance to return a proxy instead of the target bean instance.
Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
if (bean != null) {
return bean;
}
}
Object beanInstance = doCreateBean(beanName, mbdToUse, args);
}
resolveBeforeInstantiation
方法对应是实例化之前阶段的代码,doCreateBean
是后续实例化、初始化阶段。
@Nullable
protected Object resolveBeforeInstantiation(String beanName, RootBeanDefinition mbd) {
Object bean = null;
if (!Boolean.FALSE.equals(mbd.beforeInstantiationResolved)) {
// Make sure bean class is actually resolved at this point.
if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
Class> targetType = determineTargetType(beanName, mbd);
if (targetType != null) {
// 应用实例化前置增强
bean = applyBeanPostProcessorsBeforeInstantiation(targetType, beanName);
if (bean != null) {
// 应用实例化后增强
bean = applyBeanPostProcessorsAfterInitialization(bean, beanName);
}
}
}
mbd.beforeInstantiationResolved = (bean != null);
}
return bean;
}
先看看applyBeanPostProcessorsBeforeInstantiation
代码做了什么
protected Object applyBeanPostProcessorsBeforeInstantiation(Class> beanClass, String beanName) {
for (BeanPostProcessor bp : getBeanPostProcessors()) {
if (bp instanceof InstantiationAwareBeanPostProcessor) {
InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
Object result = ibp.postProcessBeforeInstantiation(beanClass, beanName);
if (result != null) {
return result;
}
}
}
return null;
}
applyBeanPostProcessorsBeforeInstantiation
先获取所有的BeanPostProcessor
,然后调用遍历类型为·InstantiationAwareBeanPostProcessor
的BeanPostProcessor
的postProcessBeforeInstantiation
对beanClass进行处理,如果postProcessBeforeInstantiation
的返回值不是null的话,直接返回该对象,否则返回null。
再看看postProcessBeforeInstantiation
的方法描述:
Apply this BeanPostProcessor before the target bean gets instantiated. The returned bean object may be a proxy to use instead of the target bean, effectively suppressing default instantiation of the target bean.在目标bean实例化之前应用这个BeanPospProcessor。返回的bean对象可以是一个代理,以代替目标bean,有效地抑制目标bean的默认实例化。
那么这一步的作用就是提供代理对象?
那么如果applyBeanPostProcessorsBeforeInstantiation
返回值是一个对象,就会执行下面的applyBeanPostProcessorsAfterInitialization
@Override
public Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName)
throws BeansException {
Object result = existingBean;
for (BeanPostProcessor processor : getBeanPostProcessors()) {
Object current = processor.postProcessAfterInitialization(result, beanName);
if (current == null) {
return result;
}
result = current;
}
return result;
}
这次遍历的是BeanPostProcessor
调用其postProcessAfterInitialization
方法,如果返回值不是null的话,直接返回该对象,否则返回null。
那么resolveBeforeInstantiation
方法返回的值要么是一个对象要么是null。
再看看createBean
的代码
try {
// Give BeanPostProcessors a chance to return a proxy instead of the target bean instance.
Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
if (bean != null) {
return bean;
}
Object beanInstance = doCreateBean(beanName, mbdToUse, args);
}
如果返回值不是null的话,直接将这个对象作为bean返回。
否则就执行下面的doCreateBean
方法,doCreateBean
中主要代码是下面这些
protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args)
throws BeanCreationException {
// Instantiate the bean.
instanceWrapper = createBeanInstance(beanName, mbd, args);
// Allow post-processors to modify the merged bean definition.
applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);
// Initialize the bean instance.
Object exposedObject = bean;
// 填充属性
populateBean(beanName, mbd, instanceWrapper);
// 初始化
exposedObject = initializeBean(beanName, exposedObject, mbd);
// Register bean as disposable.
registerDisposableBeanIfNecessary(beanName, bean, mbd);
return exposedObject;
}
Instantiate
与此阶段对应的是createBeanInstance
方法
protected BeanWrapper createBeanInstance(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) {
// 如果存在工厂方法,使用工厂方法
if (mbd.getFactoryMethodName() != null) {
return instantiateUsingFactoryMethod(beanName, mbd, args);
}
// Shortcut when re-creating the same bean...
boolean resolved = false;
boolean autowireNecessary = false;
if (args == null) {
synchronized (mbd.constructorArgumentLock) {
// 构造函数/工厂方法不为空
if (mbd.resolvedConstructorOrFactoryMethod != null) {
resolved = true;
autowireNecessary = mbd.constructorArgumentsResolved;
}
}
}
if (resolved) {
// 如果需要自动注入
if (autowireNecessary) {
// 自动注入构造器
return autowireConstructor(beanName, mbd, null, null);
}
else {
return instantiateBean(beanName, mbd);
}
}
// Candidate constructors for autowiring?
Constructor>[] ctors = determineConstructorsFromBeanPostProcessors(beanClass, beanName);
if (ctors != null || mbd.getResolvedAutowireMode() == AUTOWIRE_CONSTRUCTOR ||
mbd.hasConstructorArgumentValues() || !ObjectUtils.isEmpty(args)) {
return autowireConstructor(beanName, mbd, ctors, args);
}
// Preferred constructors for default construction?
ctors = mbd.getPreferredConstructors();
if (ctors != null) {
return autowireConstructor(beanName, mbd, ctors, null);
}
// 使用无参数构造
// No special handling: simply use no-arg constructor.
return instantiateBean(beanName, mbd);
}
createBeanInstance
中先判断bean实例化的形式并执行。有工厂方法,自动注入,默认构造方法,无参构造等多种形式的实例化。
modify bean definition
对应的是applyMergedBeanDefinitionPostProcessors
方法
protected void applyMergedBeanDefinitionPostProcessors(RootBeanDefinition mbd, Class> beanType, String beanName) {
for (BeanPostProcessor bp : getBeanPostProcessors()) {
if (bp instanceof MergedBeanDefinitionPostProcessor) {
MergedBeanDefinitionPostProcessor bdp = (MergedBeanDefinitionPostProcessor) bp;
bdp.postProcessMergedBeanDefinition(mbd, beanType, beanName);
}
}
}
这个方法是遍历所有的MergedBeanDefinitionPostProcessor
执行其postProcessMergedBeanDefinition
方法,对bean的定义信息做修改增强。
AfterInstantiation
这个小阶段对应的是
@SuppressWarnings("deprecation") // for postProcessPropertyValues
protected void populateBean(String beanName, RootBeanDefinition mbd, @Nullable BeanWrapper bw) {
boolean continueWithPropertyPopulation = true;
// bean不是合成的且当前工厂有InstantiationAwareBeanPostProcessors
if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
for (BeanPostProcessor bp : getBeanPostProcessors()) {
if (bp instanceof InstantiationAwareBeanPostProcessor) {
InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
if (!ibp.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)) {
continueWithPropertyPopulation = false;
break;
}
}
}
}
}
if (!continueWithPropertyPopulation) {
return;
}
}
遍历InstantiationAwareBeanPostProcessor
,执行postProcessAfterInstantiation
如果返回 e,退出循环。如果continueWithPropertyPopulation为false,退出populateBean
方法。那么同样在 方法内的小阶段autowire和applyPropertyValues就不会被执行了,
看一下postProcessAfterInstantiation
的方法描述
如果应在bean上设置属性,则为true;如果应跳过属性填充,则为false。正常的实现应该返回true。返回false还将阻止在此bean实例上调用任何后续实例化。
autowire
这个小阶段同样在populateBean
方法内
PropertyValues pvs = (mbd.hasPropertyValues() ? mbd.getPropertyValues() : null);
if (mbd.getResolvedAutowireMode() == AUTOWIRE_BY_NAME || mbd.getResolvedAutowireMode() == AUTOWIRE_BY_TYPE) {
MutablePropertyValues newPvs = new MutablePropertyValues(pvs);
// Add property values based on autowire by name if applicable.
if (mbd.getResolvedAutowireMode() == AUTOWIRE_BY_NAME) {
autowireByName(beanName, mbd, bw, newPvs);
}
// Add property values based on autowire by type if applicable.
if (mbd.getResolvedAutowireMode() == AUTOWIRE_BY_TYPE) {
autowireByType(beanName, mbd, bw, newPvs);
}
pvs = newPvs;
}
autowire阶段根据AutowireMode的类型,获取需要自动注入的Bean 并与属性-值的形式存入PropertyValue中。
applyPropertyValues
// 判断是否有InstantiationAwareBeanPostProcessors
boolean hasInstAwareBpps = hasInstantiationAwareBeanPostProcessors();
// 是否要check
boolean needsDepCheck = (mbd.getDependencyCheck() != AbstractBeanDefinition.DEPENDENCY_CHECK_NONE);
PropertyDescriptor[] filteredPds = null;
if (hasInstAwareBpps) {
if (pvs == null) {
pvs = mbd.getPropertyValues();
}
//遍历InstantiationAwareBeanPostProcessor,执行postProcessProperties对PropertyDescriptor的值进行修改处理。
for (BeanPostProcessor bp : getBeanPostProcessors()) {
if (bp instanceof InstantiationAwareBeanPostProcessor) {
InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
PropertyValues pvsToUse = ibp.postProcessProperties(pvs, bw.getWrappedInstance(), beanName);
if (pvsToUse == null) {
if (filteredPds == null) {
filteredPds = filterPropertyDescriptorsForDependencyCheck(bw, mbd.allowCaching);
}
pvsToUse = ibp.postProcessPropertyValues(pvs, filteredPds, bw.getWrappedInstance(), beanName);
if (pvsToUse == null) {
return;
}
}
pvs = pvsToUse;
}
}
}
if (needsDepCheck) {
if (filteredPds == null) {
filteredPds = filterPropertyDescriptorsForDependencyCheck(bw, mbd.allowCaching);
}
// 检查依赖
checkDependencies(beanName, mbd, filteredPds, pvs);
}
if (pvs != null) {
// 应用给定的属性值,解析对该bean工厂中其他bean的任何运行时引用。使用深拷贝
applyPropertyValues(beanName, mbd, bw, pvs);
}
autowire和 applyPropertyValues阶段其实就是 属性填充这一生命周期,在此周期解析自动注入还有对自动注入值的增强。
invokeAwareMethods
invokeAwareMethods阶段代码是在initializeBean
方法调用里的。
protected Object initializeBean(final String beanName, final Object bean, @Nullable RootBeanDefinition mbd) {
if (System.getSecurityManager() != null) {
AccessController.doPrivileged((PrivilegedAction
private void invokeAwareMethods(final String beanName, final Object bean) {
// 判断bean是否是Aware接口
if (bean instanceof Aware)
// 应用相应的方法
if (bean instanceof BeanNameAware) {
((BeanNameAware) bean).setBeanName(beanName);
}
if (bean instanceof BeanClassLoaderAware) {
ClassLoader bcl = getBeanClassLoader();
if (bcl != null) {
((BeanClassLoaderAware) bean).setBeanClassLoader(bcl);
}
}
if (bean instanceof BeanFactoryAware) {
((BeanFactoryAware) bean).setBeanFactory(AbstractAutowireCapableBeanFactory.this);
}
}
}
invokeAwareMethods 阶段就就是执行Aware
接口里的方法。
postProcessAfterInitialization
postProcessAfterInitialization阶段对应的是initializeBean
方法里调用的applyBeanPostProcessorsBeforeInitialization
方法
public Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName)
throws BeansException {
Object result = existingBean;
for (BeanPostProcessor processor : getBeanPostProcessors()) {
Object current = processor.postProcessBeforeInitialization(result, beanName);
if (current == null) {
return result;
}
result = current;
}
return result;
}
applyBeanPostProcessorsBeforeInitialization
方法遍历所有的BeanPostProcessor,调用其postProcessBeforeInitialization
方法对bean进行增强。
invokeInitMethods
protected void invokeInitMethods(String beanName, final Object bean, @Nullable RootBeanDefinition mbd)
throws Throwable {
// 如果是InitializingBean,调用其afterPropertiesSet方法
boolean isInitializingBean = (bean instanceof InitializingBean);
if (isInitializingBean && (mbd == null || !mbd.isExternallyManagedInitMethod("afterPropertiesSet"))) {
....
((InitializingBean) bean).afterPropertiesSet();
.....
}
// 如果存在自定义的Init方法,则调用
if (mbd != null && bean.getClass() != NullBean.class) {
String initMethodName = mbd.getInitMethodName();
if (StringUtils.hasLength(initMethodName) &&
!(isInitializingBean && "afterPropertiesSet".equals(initMethodName)) &&
!mbd.isExternallyManagedInitMethod(initMethodName)) {
invokeCustomInitMethod(beanName, bean, mbd);
}
}
}
// 删除了权限校验的代码
protected void invokeCustomInitMethod(String beanName, final Object bean, RootBeanDefinition mbd)
throws Throwable {
.....
String initMethodName = mbd.getInitMethodName();
// 反射调用init方法。
final Method initMethod = (mbd.isNonPublicAccessAllowed() ?
BeanUtils.findMethod(bean.getClass(), initMethodName) :
ClassUtils.getMethodIfAvailable(bean.getClass(), initMethodName));
......
initMethod.invoke(bean), getAccessControlContext());
}
invokeInitMethods阶段,先判断是否为InitializingBean,是的话调用afterPropertiesSet
方法。然后如果存在自定义的Init
方法的话,以反射的形式调用。
postProcessAfterInitialization
@Override
public Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName)
throws BeansException {
Object result = existingBean;
for (BeanPostProcessor processor : getBeanPostProcessors()) {
Object current = processor.postProcessAfterInitialization(result, beanName);
if (current == null) {
return result;
}
result = current;
}
return result;
}
applyBeanPostProcessorsAfterInitialization
方法遍历所有的BeanPostProcessor,调用其postProcessAfterInitialization
方法对bean进行增强。
registerDisposableBean
protected void registerDisposableBeanIfNecessary(String beanName, Object bean, RootBeanDefinition mbd) {
AccessControlContext acc = (System.getSecurityManager() != null ? getAccessControlContext() : null);
if (!mbd.isPrototype() && requiresDestruction(bean, mbd)) {
// 如果是单例
if (mbd.isSingleton()) {
// Register a DisposableBean implementation that performs all destruction
// work for the given bean: DestructionAwareBeanPostProcessors,
// DisposableBean interface, custom destroy method.
// 添加的单例bean的map里面,使用DisposableBeanAdapter注册Destruction回调
registerDisposableBean(beanName,
new DisposableBeanAdapter(bean, beanName, mbd, getBeanPostProcessors(), acc));
}
else {
// 向作用域map注册Destruction回调
// A bean with a custom scope...
Scope scope = this.scopes.get(mbd.getScope());
if (scope == null) {
throw new IllegalStateException("No Scope registered for scope name '" + mbd.getScope() + "'");
}
scope.registerDestructionCallback(beanName,
new DisposableBeanAdapter(bean, beanName, mbd, getBeanPostProcessors(), acc));
}
}~~~~
}
registerDisposableBeanIfNecessary 阶段就是根据bean作用域的不同,注册其解构的回调函数。
自此 bean已经处于就绪状态了,等到scope结束或者容器销毁,就执行其
destroy
方法,销毁bean。
划分这么多小阶段只是为了分析源码时比较方便,而从spring原本的设计思想来看,生命周期应当是下面的这张图,此图引用于 https://www.jianshu.com/p/1de...。