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()生成代理对象。

相关推荐
西风未眠8 分钟前
高效编辑之vi/vim常用快捷键汇总
linux·编辑器·vim
_Stellar9 分钟前
Linux 服务器管理 根目录文件夹权限设置 基于用户组实现安全共享
linux·服务器·安全
LUCIFER29 分钟前
驱动开发:详细分析 DTB、DTS、DTSI、DTBO 的区别、用途及它们之间的关系
linux·服务器·驱动开发
BullSmall2 小时前
Test Matrix:测试矩阵(IT 领域定义 + 设计实践 + 华为场景应用)
运维·服务器
liuyao_xianhui2 小时前
版本控制器git--gdb/cgdb
linux·运维·服务器·git
CS_浮鱼2 小时前
【Linux进阶】mmap实战:文件映射、进程通信与LRU缓存
linux·运维·c++·缓存
chuxinweihui2 小时前
应用层协议 HTTP
linux·服务器·网络·网络协议·http
xu_yule3 小时前
Linux_16(多线程)信号量+基于环形队列的生成消费模型+自选锁+读写锁
linux·运维·服务器
行初心3 小时前
uos基础 systemctl 查看unit的详细配置
运维
eyuiomvtywn3 小时前
阿里云DNS解析Vercel部署项目的域名
运维·服务器·阿里云