spring的aop动态代理对象注入时机

bean生命周期:

  1. bean实例化
  2. populateBean填充属性
  3. invokeAwareMethods调用aware方法
  4. postProcessBeforeInitialization后置处理器before方法
  5. initializeBean初始化bean
  6. 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()生成代理对象。

相关推荐
PyAIGCMaster8 分钟前
python环境中,敏感数据的存储与读取问题解决方案
服务器·前端·python
dessler27 分钟前
云计算&虚拟化-kvm创建网桥(bridge)
linux·运维·云计算
YRr YRr29 分钟前
Ubuntu20.04 解决一段时间后键盘卡死的问题 ubuntu
linux·数据库·ubuntu
何曾参静谧37 分钟前
「Py」模块篇 之 PyAutoGUI库自动化图形用户界面库
运维·python·自动化
麻花20131 小时前
WPF学习之路,控件的只读、是否可以、是否可见属性控制
服务器·前端·学习
一只哒布刘2 小时前
RHCE-DNS域名解析服务器
运维·服务器
醇氧2 小时前
ab (Apache Bench)的使用
linux·学习·centos·apache
千城丶Y2 小时前
GoogleCloud服务器的SSH连接配置
服务器·ssh·googlecloud
华纳云IDC服务商2 小时前
怎么选择香港服务器的线路?解决方案
服务器·网络·香港服务器
sss-web12262 小时前
4.远程访问及控制
运维·服务器