三级缓存和代理

三级缓存和代理

场景一:AB循环引用,A会被AOP处理

  1. A实例化,入三级缓存(getEarlyBeanReference),填充属性引起B的处理

    A:位于三级缓存,是target,属性填充阶段

  2. B实例化,入三级缓存,填充属性

    1. 查三级缓存,触发getEarlyBeanReference执行,此阶段会进行AspectJAwareAdvisorAutoProxyCreator处理,返回A#proxy
    2. A#proxy移动到二级缓存
    3. B属性填充完成
    4. 后续操作:初始化,其他处理,移动到一级缓存

    A:位于二级缓存,是targer

    B:位于一级缓存,是target,B.a是proxy

  3. 继续A的处理:属性填充,初始化,a作为早期引用暴露则进行替换 查二级缓存的proxy替换当前的target,移动到一级缓存

问题:为什么需要三级缓存?

A.a位于三级缓存,是target,然后嵌套引起B实例化,将会通过三级缓存获取A触发getEarlyBeanReference -> AspectJAwareAdvisorAutoProxyCreator生成A的proxy,所以这个时候(三级缓存的target移除,二级缓存新增A的proxy)。

场景:AB循环引用,AB都经过AOP处理生成proxy

B会在初始化(Aware,前置,自定义init-method,后置处理)的后置处理阶段,进行AspectJAwareAdvisorAutoProxyCreator处理,返回proxy,最后移动到一级缓存

总结

  1. 循环引用带来的提前暴露,在查三级缓存触发getEarlyBeanReference,从而AspectJAwareAdvisorAutoProxyCreator创建proxy,然后移动到二级缓存;
  2. 正常流程的代理,则在后置处理阶段,触发AspectJAwareAdvisorAutoProxyCreator创建proxy,然后移动到一级缓存。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值