bean生命周期:
- bean实例化
- populateBean填充属性
- invokeAwareMethods调用aware方法
- postProcessBeforeInitialization后置处理器before方法
- initializeBean初始化bean
- postProcessAfterAfterInitialization后置处理器after方法
代理对象注入有两种情况:提前和非提前生成代理对象
1. 非提前生成代理对象
依赖于beanPostProcessor实现,具体实现类是AnnotationAwareAspectJAutoProxyCreator的postProcessAfterInitialization()方法。
2. 提前生成代理对象
为解决循环依赖,依赖于三层缓存,singletonObject,earlySingletonObject,singletonFactories:
为什么需要二级缓存:为了防止 A依赖B、C,B依赖A,C依赖A这种情况,重复获取 (https://www.zhihu.com/question/501359984)
为什么三级缓存不直接存半成品的SingletonObject(而是存的ObjectFactory):为了支持注入代理对象(https://www.zhihu.com/question/501359984)
!! 不行,因为假如你想对添加到三级缓存中的实例对象进行增强,直接用实例对象是行不通的。针对这种场景spring是怎么做的呢?
它定义了一个匿名内部类,通过getEarlyBeanReference方法获取代理对象,其实底层是通过AbstractAutoProxyCreator类的getEarlyBeanReference()生成代理对象。