谈到spring bean的生命周期,相信很多同学或多或少的能说出几个步骤,大部分应该都是从网上扒一扒,然后背一背,理解的不是那么深刻,更别提应用了那么今天我们来通过源码的形式来看一看bean创建的整个流程
流程图
图一
源码分析
首先我们从入口处找到核心的创建逻辑,如下图
doCreateBean方法包含了bean创建的全过程,接下来开始着重分析图一的这几个步骤
1.实例化
在doCreateBean中有一个方法createBeanInstance,见名知意 创建bean实例,继续深入
终于看到我们熟悉的代码了,通过class对象获取声明的构造方法,然后传给BeanUtils的instantiateClass()方法,然后我们看一下instantiateClass这个方法做了什么事情,
一目了然,通过反射创建实例返回,实例化结束。
2.属性填充
我们返回到AbstractAutowireCapableBeanFactory的doCreateBean()方法继续往下看,
populateBean方法就做了属性填充这个工作,我们找一个地方感受一下
其中参数psv里面有一个PropertyValue list 存的就是属性名和值,至此,属性填充完成。
3.执行setXXXAware方法
紧挨着populateBean完成之后,执行initializeBean方法
图二
invokeAwareMethods是执行aware方法
由这个方法,我们可以看到只要是实现了BeanNameAware、BeanClassLoaderAware或者BeanFactoryAware,便执行它的set方法,此步骤完成。
4.执行BeanPostProcessor的postProcessBeforeInitialization方法
在图二里面调用了applyBeanPostProcessorsBeforeInitialization方法,
遍历beanPostProcessor,然后执行,完成。
5.执行afterPropertiesSet、init-method
继续看 图二,invokeInitMethods方法,
先执行执行afterPropertiesSet方法,再去调用invokeCustomInitMethod方法执行init-method。
通过以上步骤,bean创建完成。
6.执行DisposableBean的destroy方法、destroy-method
在doCreateBean的最后注册了destroy方法,但是执行是在容销毁的时候,通过跟踪代码可以找到如下地方
以上便是bean从创建到销毁的过程
结语
通过以上分析,我们可以清楚的理解到在整个过程当中,哪些地方是扩展给我们的东西,如果有必要的话,可以在这些点上加入我们业务上的东西