我们就从最先执行的setBeanName开始一览,spring bean 的生命周期
setBeanName 的执行流程
先看一波 debug 栈的截图
先是registerBeanPostProcessors
这个都熟悉,接下来是 getBean相关的,不关心,我们关心初始化的时候干了嘛,那就从 createBean 开始看起,一定要记着这个时候类的构造方法已经调用过了哦。
createBean
方法开始有很多 check ,接着下面这句,猜测是跟代理初始化相关的,我们没添加代理,先放过
// Give BeanPostProcessors a chance to return a proxy instead of the target bean instance.
Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
然后,进入doCreateBean
方法,这个方法我们还是直奔 debug 指示的initializeBean
方法,其中1783 行的invokeAwareMethods
方法里面执行了我们关心的setBeanName
方法。仔细的浏览一下这个方法:
private void invokeAwareMethods(final String beanName, final Object bean) {
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);
}
}
}
同时发现不仅setBeanName
在这里执行,还有setBeanClassLoader
和setBeanFactory
也是在这里执行的。
再回到doCreateBean
方法,往下翻会发现下面这行
// Register bean as disposable.
registerDisposableBeanIfNecessary(beanName, bean, mbd);
点进去看看这里面其实会注册 DisposableBean interface, 自定义的 destroy method。
而这些都是在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory
这个类里面
setApplicationContext执行流程
再看看setApplicationContext
的执行流程和 setBeanName
有何不同
同样的也是从registerBeanPostProcessors
开始,一直到initializeBean
,和上面的 setBeanName 都是一样的,只不过这次是到了 1788 行的org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsAfterInitialization
方法,看看这个方法实现
public Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName)
throws BeansException {
Object result = existingBean;
for (BeanPostProcessor processor : getBeanPostProcessors()) {
Object current = processor.postProcessBeforeInitialization