首页 > 其他分享 >spring为什么不能只用一二级缓存来解决循环依赖?

spring为什么不能只用一二级缓存来解决循环依赖?

时间:2022-08-20 21:35:16浏览次数:78  
标签:缓存 对象 spring 代理 生成 二级缓存 实例 只用

Spring bean注入流程
类实例化 -> 属性注入 -> 执行初始化方法 -> (如果有需要)生成代理对象 -> 使用


二级缓存存在的问题
举例说明:A、B两个类相互依赖,初始化A的时候,

第一步实例化A完成(原始实例放入二级缓存),注入依赖属性B,一级缓存查询B没有,二级缓存查询B没有,

初始化B(放入缓存),注入依赖属性A,一级缓存查询A没有,二级缓存查询A注入(此时A是原始实例,未被代理),生成代理对象B,移入一级缓存,继续A属性注入(B的代理对象),A初始化完成。

B中的依赖对象A是未代理的,存在问题(环境中存在代理和未代理的两种类型的同一个对象A)。

如果上述流程放入二级缓存的是代理对象,则和spring bean生成流程(实例最后生成代理对象)相悖。


三级缓存解决的问题
A、B两个类相互依赖,初始化A的时候,第一步实例化A完成(生成对象工厂实例放入三级缓存),注入依赖属性B,一级缓存查询B没有,二级缓存查询B没有,

初始化B(生成对象工厂实例放入三级缓存),注入依赖属性A,一级缓存查询A没有,二级缓存查询A没有,三级缓存查询到A的对象工厂,生成A的代理对象,放入到二级缓存,注入A的代理对象完成,生成代理对象B,移入一级缓存。

继续A属性注入(B的代理对象),A初始化,生成A的代理对象,发现A的代理对象已存在,则跳过,放入一级缓存。此时A的代理对象也是提前生成的,但是仅针对循环依赖提前生成。

 

三级缓存正常生成流程

第一步实例化A完成(生成对象工厂实例放入三级缓存,此时虽然放入三级缓存,但没有生成代理对象),注入属性,执行初始化方法,生成代理对象,移入一级缓存。

标签:缓存,对象,spring,代理,生成,二级缓存,实例,只用
From: https://www.cnblogs.com/sanguoasd/p/16140137.html

相关文章

  • Spring之控制反转IoC与依赖注入DI讲解
    1.最终目录2.代码示例(1)BookDaoImpl.java与BookServiceImpl.javapackagecom.hung.dao.Impl;importcom.hung.dao.BookDao;importcom.hung.service.Impl.BookSe......
  • Spring体现的设计模式
    涉及到的模式工厂设计模式:Spring使用工厂模式通过BeanFactory、ApplicationContext创建bean对象。代理设计模式:SpringAOP功能的实现。单例设计模式:Sprin......
  • Spring Bean生命周期
    Bean的生命周期Bean容器找到配置文件中SpringBean的定义。Bean容器利用JavaReflectionAPI创建一个Bean的实例。如果涉及到一些属性值利用set()方法设置......
  • 【SpringBoot】定时任务
    SpringBoot实现定时任务SpringBoot创建定时任务,目前主要有以下三种实现方式:基于注解(@Scheduled):基于注解@Scheduled默认为单线程,开启多个任务时,任务的执行时机会受上......
  • spring注解之@Import注解的三种使用方式
    @目录1、@Import注解须知2、@Import的三种用法2.1、第一种用法:直接填class数组2.2、第二种用法:ImportSelector方式【重点】2.3、第三种用法:ImportBeanDefinitionRegistrar......
  • Spring Boot调用api patch接口
    SpringBoot调用apipatch接口示例:/***调用apipatch接口**@paramurl*@paramjsonObject*@returnjava.lang.String*@a......
  • Spring Boot调用api delete接口
     SpringBoot调用apidelete接口示例:/***调用apidelete接口**@paramurl*@authorli.zhm*@date2022/8/2014:07*@hist......
  • spring源码学习笔记1——解析xml生成BeanDefinition的过程解析
    spring源码学习笔记1——解析xml生成BeanDefinition的过程解析一丶Spring解析Xml生成BeanDefinition的流程1.指定xml路径解析xml首先需要知道xml的位置,如下我们构造了Ap......
  • 【Spring5学习笔记(4)】事务管理:
    事务1、什么是事务(1)事务是数据库操作的最基本单元,是逻辑上的一组操作,要么都成功,如果有一个失败则所有操作都失败(2)经典场景:银行转账2、事务的四个特性(ACID)(1)原子性:一组逻辑操......
  • SpringBoot 搭建和使用图形化监控界面
    我们开发好的SpringBoot服务发布到公网上,肯定希望能够对其状态和资源消耗情况进行监控,特别是对每个接口访问情况的统计,以便在发生问题时能够快速排查和分析并解决问题。......