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

相关推荐
程序员老邢2 分钟前
【技术底稿 34】文件存储服务域名切换 & S3 兼容性问题全复盘
运维·文件存储·seaweedfs·程序员日常·技术底稿·s3兼容·线上问题复盘
浩瀚之水_csdn16 分钟前
Linux grep 命令完全详解
服务器·数据库·mysql
怀旧,23 分钟前
【Linux网络编程】5. 应用层协议 HTTP
linux·网络·http
码点滴33 分钟前
用自然语言指挥 K8s 集群:AI 运维 Agent 的架构原理与可运行原型
运维·人工智能·kubernetes
2301_8163743339 分钟前
利用反向代理实现动静分离
运维
SurpriseDPD42 分钟前
Linux 内核基础知识:READ_ONCE、内存屏障与指令重排
linux·系统架构
黄金矿工Kingliu43 分钟前
Windows运行VMware蓝屏解决方案及网卡配置
运维·服务器
ziqi5221 小时前
Docker容器镜像管理、制作
运维·docker·容器
D4c-lovetrain1 小时前
Linux个人心得29(深入理解K8S Pod优先级与驱逐机制:从原理到实战踩坑)
linux·运维·kubernetes