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

相关推荐
hy____1237 分钟前
Linux_网络基础2
linux·服务器·网络
GAOJ_K31 分钟前
滚柱导轨安装后如精度偏差对机械设备有影响吗?
运维·人工智能·科技·自动化·制造
微露清风31 分钟前
系统性学习Linux-第六讲-Ext文件系统
linux·服务器·学习
喵叔哟33 分钟前
6. 【Blazor全栈开发实战指南】--组件通信与共享状态
linux·网络·windows
大黄说说34 分钟前
Spring Boot 项目优雅上线:日志、监控、异常处理最佳实践
运维·jenkins
桌面运维家42 分钟前
云桌面vDisk解决方案:Windows/Linux高效部署与优化
linux·运维·服务器
wsoz1 小时前
GCC编译
linux·c语言·嵌入式·gcc
一只程序熊1 小时前
vite-cool-unix-ctx] Unexpected token l in JSON at position 0
java·服务器·前端
Adorable老犀牛1 小时前
给运维同行的一个小提议:一起做「不费力的周复盘」,让经验不白费
运维·周报·复盘·反人性·为自己
xlq223221 小时前
26(下).库的理解与加载
linux·运维·服务器