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

相关推荐
一个小浪吴啊13 小时前
MacOS/Linux/Windows 跨平台一键安装OpenCode指南
linux·windows·macos·opencode
圆山猫13 小时前
[AI] [Linux] 教我用rust写一个GPIO驱动
linux·rust
Cat_Rocky13 小时前
网络技术基础一点点
运维·服务器·网络
Agent产品评测局13 小时前
混合云架构适配:企业级智能体灵活部署完整方案与最佳实践 | 2026企业自动化选型硬核指南
运维·人工智能·ai·chatgpt·架构·自动化
江公望13 小时前
Linux kernel devm_of_platform_populate()函数浅谈
linux
其实防守也摸鱼13 小时前
AWVS下载和安装保姆级教程
linux·服务器·git
舰长11513 小时前
nginx常用配置反向代理配置
运维·websocket·nginx
爱学习的小囧13 小时前
虚拟机开机放哪台主机?ESXi DRS 初始放置位置选择指南:CPU / 内存 / 存储 / 网络综合评分攻略
服务器·esxi·虚拟化·esxi8.0
要做一个小太阳13 小时前
Consul SD 常见标签
运维·数据库·consul
洛洛呀。13 小时前
Kali系统桥接模式下相关网络故障
linux·服务器·桥接模式