进入initializeBean()
先检查是否有安全管理器,如果有就以特权方式执行回调bean中Aware接口方法
invokeAwareMethods()
invokeAwareMethods()这个方法处理了3个Aware(更多关于Aware的内容可移步至那些Aware们)
BeanNameAware
BeanClassLoaderAware
BeanFactoryAware
接下来进行两个判断:
mbd为null
mbd不是“synthetic”
二者满足一个就会执行方法applyBeanPostProcessorsBeforeInitialization(),即前置处理器的调用
applyBeanPostProcessorsBeforeInitialization()
方法applyBeanPostProcessorsAfterInitialization()先将传入的Object赋值给此方法最终的返回结果result,接下来会对这个结果进行层层包装
遍历该工厂创建的bean的BeanPostProcessors,依次调用当前遍历到的BeanPostProcessor的postProcessBeforeInitialization()方法(这个方法会在初始化Bean前进行调用),将当前BeanPostProcessor应用到给定的Bean实例(由于Bean已经填充了属性,返回的可能是原始Bean的包装器)
如果返回的对象为null,则直接返回result,中断后续的BeanPostProcessor的处理
如果返回的对象不为null,则将其赋值给result(让result引用processor的返回结果,使其经过所有BeanPostProcessor对象的后置处理器的层层包装)
在接下来就是执行初始化方法invokeInitMethods()了
invokeInitMethods()
定义一个布尔值用于作为是否实现了InitializingBean接口的标识位,如果实现了InitializingBean并且有afterPropertiesSet,则调用afterPropertiesSet方法
invokeCustomInitMethod()
执行invokeCustomInitMethod()方法中的反射逻辑
applyBeanPostProcessorsAfterInitialization()
最后,执行方法applyBeanPostProcessorAfterInitialization(),即后置处理器的调用
将BeanPostProcessor应用到给定的现有实例(逻辑与上面👆介绍的applyBeanPostProcessorsBeforeInitialization()基本一致)
下图可以瞅下debug过程中,某一次遍历使所执行的BeanPostProcessors都有哪些
插播1个问题:自己new的对象,是否会执行初始化方法?
卖个关子先(答案是不会(˶‾᷄ ⁻̫ ‾᷅˵)),我简单new个示例供各位客官瞅瞅、
我新建了两个对象,一个用上下文对象获取(红框框),一个自己new(黄框框),并且在两个对象创建之间加了行输出,并且打了断点,同时在initializeBean()方法处打了断点,debug启动
结果是执行到输出行前,代码停在了initializeBean()方法的断点处,点击继续,执行了输出操作,接着就直接结束了,也就是说,我们自己new的对象是不会调用initializeBean()方法的~
结尾习惯性撒个花(。・ω・。)ノ🎉🎉🎉