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

相关推荐
涛思数据(TDengine)1 小时前
新客户 | TDengine 时序数据库是怎么在钢厂“撬动”PI 的?
大数据·运维·数据库·时序数据库·tdengine
菜鸟也会Fly2 小时前
【/usr/bin/env: “bash\r”: 没有那个文件或目录】问题解决
linux·bash
楠目2 小时前
Shell脚本实现自动封禁恶意扫描IP
服务器·网络·tcp/ip
程序员黄老师3 小时前
Linux tail 命令详解
linux·运维
我怎么又饿了呀4 小时前
Windows&Linux系统 安装 CUDA 和 cuDNN
linux·运维·windows
xybDIY5 小时前
智能云探索:基于Amazon Bedrock与MCP Server的AWS资源AI运维实践
运维·人工智能·aws
阿 柒6 小时前
网络基础——网络层级
运维·服务器·网络
慌ZHANG6 小时前
云原生时代的 Linux:容器、虚拟化与分布式的基石
linux·云原生
鱼鱼说测试6 小时前
jmeter+ant+jenkins接口自动化测试框架
运维·jmeter·jenkins
ℳ₯㎕ddzོꦿ࿐6 小时前
在 Debian 系统上安装 Redis服务
运维·redis·debian