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

相关推荐
安达发27 分钟前
安达发|高效智能塑料切割数控系统 - 全自动化软件解决方案
大数据·运维·人工智能·自动化·aps排产软件·智能优化排产软件
xbd_zc34 分钟前
【Vagrant+VirtualBox创建自动化虚拟环境】Ansible测试Playbook
linux·ubuntu·自动化·ansible·虚拟机·vagrant·virtualbox
lsnm2 小时前
【LINUX操作系统】线程操作
linux·jvm·c++·ubuntu·centos·gnu
Nueuis2 小时前
微信小程序分页和下拉刷新
服务器·前端·微信小程序
FREEDOM_X3 小时前
Ubuntu 20.04 安装 ROS 2 Foxy Fitzroy
linux·ubuntu·机器人
华纳云IDC服务商3 小时前
如何利用Rust提升Linux服务器效率(详细操作指南)
linux·服务器·rust
桦04 小时前
【Linux】g++安装教程
linux·运维·服务器
Once_day4 小时前
Linux之netlink(2)libnl使用介绍(1)
linux·netlink·libnl3
Hfc.4 小时前
rabbitmq-集群部署
linux·运维·服务器
小草cys5 小时前
[零基础]内网ubuntu映射到云服务器上,http访问(frp内网穿透)
运维·服务器