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

相关推荐
从零开始学习人工智能5 分钟前
深入解析 OPC UA:工业自动化与物联网的关键技术
运维·物联网·自动化
wanhengidc17 分钟前
UDP服务器主要是指什么意思?
服务器·网络协议·udp
李迟29 分钟前
在Linux服务器上使用kvm创建虚拟机
java·linux·服务器
从后端到QT36 分钟前
SRS流媒体服务器(8)源码分析之rtc/rtmp互相转码详解
运维·服务器·实时音视频
CodeWithMe38 分钟前
Nginx入门进阶:从零到高手的实战指南
运维·nginx
A_New_World38 分钟前
Linux性能分析工具
linux
鹏大师运维41 分钟前
在银河麒麟V10 SP1上手动安装与配置高版本Docker的完整指南
linux·运维·docker·容器·麒麟·统信uos·中科方德
QMCY_jason1 小时前
linux 内存占用排查 vm.nr_hugepages
linux·运维·服务器
cui_win1 小时前
【基础】Golang语言开发环境搭建(Linux主机)
linux·golang·运维开发
半方白1 小时前
通过 ks.cfg 文件实现 openEuler 系统自动部署
运维·自动化运维