关于Spring为什么需要使用第三级缓存的原因分析

Spring 三级缓存 实际上使用了3个Map 来打破单例对象循环依赖的问题,singletonObjects:这是一级缓存,保存已经实例化且完成了所有的依赖注入和初始化的单例bean实例。earlySingletonObjects:这是二级缓存,保存已经实例化但尚未完成所有的依赖注入和初始化的单例bean实例。它主要用于解决属性注入时的循环依赖问题。singletonFactories:这是三级缓存,保存创建单例bean实例的ObjectFactory。

通过代码仔细分析发现,如果不要singletonFactories这个第三级的缓存,也能解决循环依赖问题,那singletonFactories缓存存在的意义是什么,笔者经过查阅资料和思考分析后,总结原因如下:

1、违反了spring 对代理对象生成的原则,Spring 的设计原则是尽可能保证普通对象创建完成之后,再生成其 AOP 代理(尽可能延迟代理对象的生成),因为这样做的话,所有代理都提前到了实例化之后,初始化阶段前,显然与尽可能延迟代理对象的生成 原则是违背的。

2、防止因为提前被代理导致出现副作用,笔者认为这是最主要的原因。因为在bean对象实例后,还需要经过依赖属性的注入(populateBean方法)和初始化工作(initializeBean方法),特别是在初始化工作时,会进行调用BeanNameAware、BeanPostProcessor、InitializingBean、aop代理等一序列化工作,如果调用这些序列化工作的时候,就用代理对象来去执行调用,假设刚好这些方法被代理了,那就有可能执行这些初始化方法就包含有代理的逻辑在里面一起执行了,从而导致代理逻辑被误执行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奕辰杰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值