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

相关推荐
清漠23314 小时前
win11“网络和Internet“中无“以太网“这个选项解决记录
服务器·网络·数据库
S-码农14 小时前
Linux 进程核心知识
linux
努力努力再努力wz14 小时前
【Linux网络系列】:TCP 的秩序与策略:揭秘传输层如何从不可靠的网络中构建绝对可靠的通信信道
java·linux·开发语言·数据结构·c++·python·算法
袁小皮皮不皮14 小时前
数据通信20-IPv6基础
运维·服务器·网络·网络协议·智能路由器
推理幻觉14 小时前
ssh远程连接错误
运维·ssh
醒醒该学习了!15 小时前
如何将json文件转成csv文件(python代码实操)
服务器·python·json
2401_8582861115 小时前
OS55.【Linux】理解信号量(不是信号)
linux·运维·服务器·计数器·信号量
S-码农17 小时前
Linux进程通信——消息队列
linux
SakitamaX17 小时前
KEEPALIVED介绍与实验与介绍
运维·keepalived
零基础的修炼17 小时前
Linux网络---数据链路层
linux·服务器·网络