(bean的步骤: 1、创建bean 2、填充属性 3、初始化bean) 1、一级缓存,是必须的,缓存生成好的bean 2、如果有循环依赖,需要提前暴露 bean引用,存在哪呢? 不能存在一级缓存,因为一级缓存的定义就是,拿到就能用的,这种半成品存到一级缓存,就不合适 所以,再弄个别的缓存存着。 3、于是弄个 二级缓存,暴露bean的引用,这在没有代理的情况下,返回的是原生bean引用,是没有问题的。 4、在有代理的情况下,获取暴露的bean,需要返回代理类,这里就有问题了,因为每次生成的代理类不唯一。 假如 a依赖 b、c , 同时b、c也依赖a,那么就必须保证 b、c拿到的代理类是同一个bean。 5、那就最开始判断如果有代理,那就直接生成代理类,放到二级缓存,其它依赖再需要就直接到缓存拿 6、到目前为止,用二级缓存在功能上,是没有问题的, 但是,在代码流程和对象分类上,有点不得劲。 1、分类: 刚创建的bean(暴露) ,循环依赖(创建出来的bean,可能是代理类) ,属性填充、实例化后的bean 2、流程上应该先创建普通类,填充属性,再创建代理类 ,所以是把 beanFactory的回调 在依赖的时候触发(相对延迟),而不是直接创建代理类,再填充属性。 总结:使用缓存是必须的,提升性能, 使用三级缓存是要解决循环依赖,能不能用两级? 也可以实现。 写代码永远是跟当时的情况相关,可能写了一波代码,然后就要在原来的基础上实现,并尽量优雅,可扩展。 不用太纠结一定要几层几层的。
spring的ioc为什么用三级缓存?
最新推荐文章于 2024-07-20 21:56:23 发布