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

相关推荐
颢珂智库Haokir Insights几秒前
如何把 MCP 接入到文档 / Issue / CI,形成可复用的工程外脑
服务器·人工智能·ai编程·vllm·vibecoding
网宿安全演武实验室10 分钟前
Linux Rootkit 手法解析(上):用户态的“隐身术”与检测思路
linux·网络·安全·apt·攻防对抗
宇钶宇夕10 分钟前
CoDeSys入门实战一起学习(十四):功能块(FB)与程序(PRG):实例化、调用与工程实践
运维·自动化·软件工程
dump linux15 分钟前
Linux DRM GPU 驱动框架详解
linux·驱动开发·嵌入式硬件
麦聪聊数据16 分钟前
金融级数据库运维的“零信任”实践:如何在合规与效率间寻找平衡点?
运维·数据库·后端·sql·金融
Howrun77716 分钟前
Linux_C++_日志实例
linux·运维·c++
头发还没掉光光17 分钟前
C语言贪吃蛇:基于Linux中ncurses库实的贪吃蛇小游戏
linux·c语言·开发语言
为什么要做囚徒20 分钟前
Docker实战系列之Root目录迁移指南:单机环境下的完整实践
运维·docker·容器
invicinble23 分钟前
对于后端要和linux打交道要掌握的点
linux·运维·python
_Johnny_24 分钟前
ubuntu将磁盘剩余空间自动分配指南
linux·运维·ubuntu