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

相关推荐
彭泽布衣17 分钟前
远程登录docker执行shell报错input is not a terminal问题
运维·docker·容器
我是苏苏18 分钟前
Edge浏览器:报告不安全的站点的解决方案
服务器
霖0021 分钟前
FPGA通信设计十问
运维·人工智能·经验分享·vscode·fpga开发·编辑器
还是奇怪30 分钟前
Linux - 安全排查 3
android·linux·安全
NUZGNAW31 分钟前
VMware安装Centos 7
linux·运维·centos
Another Iso33 分钟前
CentOs 7 MySql8.0.23之前的版本主从复制
linux·mysql·centos
A7bert77739 分钟前
【YOLOv8-obb部署至RK3588】模型训练→转换RKNN→开发板部署
linux·c++·人工智能·python·yolo
筑梦之路1 小时前
linux 系统找出磁盘IO占用元凶 —— 筑梦之路
linux·运维·服务器
ezreal_pan2 小时前
docker设置镜像加速
运维·docker·容器
LiQiang333 小时前
Ubuntu2404修改国内镜像
linux