首先来一张bean的生命周期图
该篇文章将以加载类为起点开始分析bean的生命周期。首先不能完全保证理解正确,只是博主自己的思路,有问题及时指出,共同进步。
源码将从AbstractAutowireCapableBeanFactory中的createBean方法开始分析,也就是合并完beanDefinition,开始加载类。
@Overrideprotected Object createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)throws BeanCreationException {...RootBeanDefinition mbdToUse = mbd;// 确保bean类在这一点上得到了实际的解析Class> resolvedClass = resolveBeanClass(mbd, beanName);if (resolvedClass != null && !mbd.hasBeanClass() && mbd.getBeanClassName() != null) {mbdToUse = new RootBeanDefinition(mbd);mbdToUse.setBeanClass(resolvedClass);}// Prepare method overrides.try {mbdToUse.prepareMethodOverrides();}...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;}}...try {Object beanInstance = doCreateBean(beanName, mbdToUse, args);if (logger.isTraceEnabled()) {logger.trace("Finished creating instance of bean '" + beanName + "'");}return beanInstance;}...}
从以上源码可以看到调用了第一个resolveBeanClass,进入该方法查看。
//是否已经有了beanClass
if (mbd.hasBeanClass()) {return mbd.getBeanClass();
}
//安全管理器
if (System.getSecurityManager() != null) {return AccessController.doPrivileged(new PrivilegedExceptionAction
}
else {//加载类,这里面就是类加载器加载类的逻辑了return doResolveBeanClass(mbd, typesToMatch);
}
分析完resolveBeanClass方法后回到createBean方法中来,继续向下走,看这一段代码。
try {//给BeanPostProcessors一个返回代理而不是目标bean实例的机会Object bean = resolveBeforeInstantiation(beanName, mbdToUse);//如果已经返回了对象,则不再执行spring的实例化流程,直接返回beanif (bean != null) {return bean;}
}
resolveBeforeInstantiation方法中有这样两个方法,bean通过InstantiationAwareBeanPostProcessor接口来实现两个影响实例化的方法,允许第三方可以不按照Spring的正常流程来创建一个Bean,利用InstantiationAwareBeanPostProcessor接口的方法来提前返回一个Bean对象,直接结束Bean的生命周期,从而达到干预bean实例化的过程。这就对应上一步 给BeanPostProcessors一个返回代理而不是目标bean实例的机会
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) {
//如果实例化前的时候返回了对象,说明不再使用spring提供的实例化流程,这时直接调用实例化后方法。bean = applyBeanPostProcessorsAfterInitialization(bean, beanName);}}}mbd.beforeInstantiationResolved = (bean != null);}return bean;}
一个小demo
当对象是user时,会被实例化前处理器处理,生成一个order对象,然后直接结束bean的生命周期。
@Component
public class MyInstantiation implements InstantiationAwareBeanPostProcessor {//允许第三方可以不按照Spring的正常流程来创建一个Bean,
// 可以利用InstantiationAwareBeanPostProcessor的postProcessBeforeInstantiation方法来提前返回一个Bean对象,
// 直接结束Bean的生命周期@Overridepublic Object postProcessBeforeInstantiation(Class> beanClass, String beanName) throws BeansException {System.out.println("被干预的beanName:"+beanName);if (beanName.equals("user")){System.out.println("干预原本的bean的生命周期,生成其他对象实例");return new Order();}return null;}}
回到createBean方法中 继续向下走,有这么一句代码。去做创建bean的操作
Object beanInstance = doCreateBean(beanName, mbdToUse, args);
进入doCreateBean方法查看。
BeanWrapper instanceWrapper = null;if (mbd.isSingleton()) {instanceWrapper = this.factoryBeanInstanceCache.remove(beanName);}if (instanceWrapper == null) {//在这里去执行了bean的实例化instanceWrapper = createBeanInstance(beanName, mbd, args);}//原始对象final Object bean = instanceWrapper.getWrappedInstance();//原始对象的class类型Class> beanType = instanceWrapper.getWrappedClass();if (beanType != NullBean.class) {mbd.resolvedTargetType = beanType;}
createBeanInstance方法中进行了构造方法的推断以及实例化,作为单独篇章分析:https://blog.csdn.net/qq_39404258/article/details/109769278
在doCreateBean方法中继续走,到这里进行beanDefinition的后置处理
// 允许后处理程序修改合并的bean定义。
synchronized (mbd.postProcessingLock) {if (!mbd.postProcessed) {try {//在这里可以添加修改beanDefinition的内容,可以算作一个beanPostProcessor的扩展点applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);}catch (Throwable ex) {throw new BeanCreationException(mbd.getResourceDescription(), beanName,"Post-processing of merged bean definition failed", ex);}mbd.postProcessed = true;}
}
这里执行了applyMergedBeanDefinitionPostProcessors方法,原理都是beanPostProcessor。自定义beanPostProcessor通过实现MergedBeanDefinitionPostProcessor接口内的相应方法即可。
在doCreateBean方法中继续走,在这里进行了循环依赖的逻辑,作为单独篇章分析:https://blog.csdn.net/qq_39404258/article/details/108367587
// 如果当前创建的是单例bean,并且允许循环依赖,并且还在创建过程中,那么则提早暴露boolean earlySingletonExposure = (mbd.isSingleton() && this.allowCircularReferences &&isSingletonCurrentlyInCreation(beanName));if (earlySingletonExposure) {if (logger.isTraceEnabled()) {logger.trace("Eagerly caching bean '" + beanName +"' to allow for resolving potential circular references");}// 此时的bean还没有完成属性注入,是一个非常简单的对象// 构造一个对象工厂添加到singletonFactories中,getEarlyBeanReference暂时没断点到,疑似lambda的问题addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean)); }// 该bean就是实例化对象
Object exposedObject = bean;
至此,已经获取到了实例化对象,接下来讲实例化对象进行属性填充。
这时我们还在doCreateBean方法,下面这个方法是属性填充方法
populateBean(beanName, mbd, instanceWrapper);
进入这个方法,略过判空,看这段循环。只有postProcessAfterInstantiation返回值是false才会进行属性填充,否则直接结束属性填充。
// 在设置属性之前,给任何instantiationwarebeanpostprocessors机会修改bean的状态。
// 我们可以自己写一个InstantiationAwareBeanPostProcessor,然后重写postProcessAfterInstantiation(实例化后)方法来判断是否进行属性填充,
if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {for (BeanPostProcessor bp : getBeanPostProcessors()) {if (bp instanceof InstantiationAwareBeanPostProcessor) {InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;// 如果该方法返回false,那么则不会进行属性填充了,直接return了if (!ibp.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)) {return;}}}
}
接着向下走是进行属性填充(依赖注入),作为一个单独的篇章进行分析。
@autowired源码注入分析https://blog.csdn.net/qq_39404258/article/details/109472260
结束属性填充,回到doCreateBean方法继续走。
//暴露这个对象
exposedObject = initializeBean(beanName, exposedObject, mbd);
然后进入initializeBean方法查看。
//安全处理器,没有忽略
if (System.getSecurityManager() != null) {AccessController.doPrivileged((PrivilegedAction) () -> {invokeAwareMethods(beanName, bean);return null;}, getAccessControlContext());
}
else {//调用aware回调invokeAwareMethods(beanName, bean);
}
在这个initializeBean方法内继续向下走,执行初始化前、初始化、初始化后方法。
Object wrappedBean = bean;if (mbd == null || !mbd.isSynthetic()) {
//执行postProcessBeforeInitialization() 方法(初始化前)wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);}try {//执行初始化方法init,需实现InitializingBean接口invokeInitMethods(beanName, wrappedBean, mbd);}catch (Throwable ex) {throw new BeanCreationException((mbd != null ? mbd.getResourceDescription() : null),beanName, "Invocation of init method failed", ex);}if (mbd == null || !mbd.isSynthetic()) {
//执行postProcessAfterInitialization() 方法(初始化后)wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);}
再回到doCreateBean方法,最后面有一个这样的方法registerDisposableBeanIfNecessary,用于将实现了DisposableBean接口的bean注册进去用于close时的销毁。
registerDisposableBeanIfNecessary(beanName, bean, mbd);
以上为bean的部分生命周期::(加载类)-> 实例化->(填充属性)->(aware回调)->初始化。
总结一下在bean的生命周期里需要使用到的接口以及扩展的beanPostProcessor
1.加载类
2.实例化前 InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation
3.实例化 暂时没有分析
插入了一个beanDefinition后置处理器 MergedBeanDefinitionPostProcessor.postProcessMergedBeanDefinition
4.实例化后 InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation
5.填充属性 InstantiationAwareBeanPostProcessor.postProcessProperties
6.aware回调
7.初始化前 BeanPostProcessor.postProcessBeforeInitialization
8.初始化 InitializingBean.afterPropertiesSet,当然不止这一种可以初始化,注解(@PostConstruct)和xml(init-method)方式都可以
9.初始化后 BeanPostProcessor.postProcessAfterInitialization
10.bean使用中
11.bean销毁 DisposableBean.destroy,当然不止这一种可以销毁,注解(@PreDestroy)和xml(destroy-method)方式都可以