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

相关推荐
_ziva_几秒前
LangChain 实战:搭建 SQL 数据库自然语言问答系统(Chain + Agent 双方案)
java·服务器·数据库
chxii6 分钟前
Nginx 反向代理详解
运维·nginx
天理智能科技9 分钟前
工厂 3D 建模服务与流程|数字孪生基础工程【天理智能】
运维·服务器
我科绝伦(Huanhuan Zhou)9 分钟前
项目管理计算题通关手册(0基础大白话版)
运维·软考
hzhsec10 分钟前
密码爆破日志分析与隧道流量检查
linux·网络·windows·网络安全·应急响应
yiwenrong12 分钟前
Linux 运维英语速查表
linux·运维·服务器
道阻且长行则将至!15 分钟前
ubuntu下scp命令使用,开启ssh服务
linux·运维·ubuntu·scp·scp命令
zzj_26261018 分钟前
实验三 循环结构程序设计(Python)
服务器·python·apache
cui_ruicheng20 分钟前
Linux基础开发工具(三):Git 版本控制与 GDB 调试入门
linux·git·编辑器
.柒宇.23 分钟前
构建 keepalived + LVS + Nginx + DNS + NFS 的高可用集群系统
运维·nginx·lvs