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

相关推荐
gjc5921 分钟前
MySQL运维避坑:你的MySQL总是关机慢、启动卡?
运维·数据库·mysql
橙子也要努力变强1 分钟前
信号捕捉的底层机制-内核态和用户态初识
linux·服务器·c++
j_xxx404_5 分钟前
Linux C 语言编译链接全解析:静态库与动态库从原理到实战
linux·运维·服务器·c语言·编辑器
她叫我大水龙5 分钟前
Docker 安装和常用命令
运维·docker·容器
**蓝桉**8 分钟前
Nginx 负载均衡策略详解
运维·nginx·负载均衡
GuiltyFet9 分钟前
opencode+skill自动化渗透测试系列
运维·自动化
wanhengidc10 分钟前
云手机 云端运行托管
运维·服务器·网络·安全·web安全·智能手机
橙子也要努力变强14 分钟前
信号捕捉底层机制-进程与OS
linux·服务器·c++
青瓦梦滋14 分钟前
Linux线程
linux·运维·c++
oLLI PILO15 分钟前
在linux(Centos)中Mysql的端口修改保姆级教程
linux·mysql·centos