首页 > 其他分享 >Spring bean的循环引用问题

Spring bean的循环引用问题

时间:2023-05-29 12:44:23浏览次数:37  
标签:缓存 依赖 Spring ObjectFactory bean 循环 引用

循环依赖:两个或两个以上的bean循环引用。例如:A依赖B,B依赖A。

Spring有三种循环依赖问题:

(1)构造器的循环依赖:Spring无法解决构造器的循环依赖问题,但是可以使用@Lazy将bean声明为懒加载,什么时候用到这个bean在创建。

(2)非单例bean的setter循环依赖:Spring无法解决非单例bean的循环依赖问题。

(3)单例bean的setter循环依赖:可以采用三级缓存解决单例bean的setter循环依赖。

一级缓存:缓存经历完整生命周期的bean。

二级缓存:缓存没有经历完整生命周期的bean。

三级缓存:缓存ObjectFactory(对象工厂)。利用ObjectFactory可以创建某个对象。

使用三级缓存解决循环依赖的过程:

(1)调用A的构造器进行bean的实例化。同时将A的ObjectFactory(对象工厂)缓存到三级缓存中。

(2)A进行依赖注入,需要属性B,开始B的创建过程。

(3)调用B的构造器进行bean的实例化。同时将B的ObjectFactory(对象工厂)缓存到三级缓存中。

(4)B进行依赖注入,需要属性A。此时使用三级缓存中A的ObjectFactory生成A的对象缓存到二级缓存中,B从二级缓存中取出属性A注入。

(5)B经过Bean创建的完整生命周期后,B创建成功,将B缓存到一级缓存中。

(6)B已经创建成功,从一级缓存中取出B注入A中。

(7)A经历完整的生命周期后,创建成功。

 

标签:缓存,依赖,Spring,ObjectFactory,bean,循环,引用
From: https://www.cnblogs.com/yhb-blogs/p/17440122.html

相关文章

  • 基于注解的Spring AOP的配置和使用
    AOP是OOP的延续,是AspectOrientedProgramming的缩写,意思是面向切面编程。可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。AOP实际是GoF设计模式的延续,设计模式孜孜不倦追求的是调用者和被调用者之间的解耦,AOP可以说也是这种目标......
  • spring aop
    <?xmlversion="1.0"encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:security="http://www.springframework.or......
  • 【重学C++】05 | 说透右值引用、移动语义、完美转发(下)
    文章首发【重学C++】05|说透右值引用、移动语义、完美转发(下)引言大家好,我是只讲技术干货的会玩code,今天是【重学C++】的第五讲,在第四讲《【重学C++】04|说透右值引用、移动语义、完美转发(上)》中,我们解释了右值和右值引用的相关概念,并介绍了C++的移动语义以及如何通过右值引......
  • Spring cloud 微服务架构之Ribbon/Fegin连接超时ReadTimeout问题
    问题描述:近期用Springcloud开发微服务架构时候,在服务与服务之间调用调试代码时候,出现链接超时。错误信息:ReadtimedoutexecutingGEThttp://service-batch/batchmanagement/datatransfer/querybyplanid?planid=PL00000102。发生原因:用IDE开发Debug模式调试代码时候,在处理该服......
  • Spring事务失效的场景
    (1)方法没有用public修饰会导致事务失效。解决方法:在方法上使用public修饰。(2)使用try-catch捕获异常没有抛出异常,而是由方法自己处理会导致事务失效。解决方法:处理了异常记得抛出。(3)方法抛出检查异常会导致事务失效,报错也会导致事务失效。解决方法:在@transactional注解上配置ro......
  • 对SpringIOC和SpringAOP的理解
    SpringIOC和SpringAOP是Spring的两个核心组件。SpringIOC:SpringIOC是一个管理bean的容器,能够帮我们管理bean的整个生命周期,在没有SpringIOC的时候,我们需要自己手动的管理bean以及bean的依赖关系,这样会增加耦合,而有了SpringIOC,它能帮我们管理bean以及bean的依赖关系,使得代码解耦。......
  • Spring中的单例bean是线程安全的吗?
    Spring并没有对单例bean作线程安全的处理,在并发条件下Spring的bean是否是线程安全的有如下两种情况:(1)无状态的bean:没有数据存储能力,例如service类和dao类都是无状态的bean,所以是线程安全的。(2)有状态的bean:有数据存储能力,在并发环境下会发生线程安全问题,需要自行保证线程安全问题,......
  • spring boot 限制初始值大小及参数中文详解
    要加“m”说明是MB,否则就是KB了.-Xms:初始值-Xmx:最大值 -Xmn:最小值java-Xms10m-Xmx80m-jarmod.jar & 时区设置 java-jar-Duser.timezone=GMT+08mod.jar& #----------------------------------------  #核心属性  #----------------------------------------   #BANN......
  • SpringBoot如何整合定时任务调度
    所有的系统开发里面定时调度绝对是一个核心的话题,对于定时调用的实现在实际开发之中可以使用:TimerTask,Quartz,SpringTask配置,实际上这里面最简单的配置就是Spring自己所提供的Task处理。如果要想实现定时调度,只需要配置一个定时调度的组件类即可:1.packagecom.gwolf.task;2.3.......
  • 循环依赖导致编译或者服务启动报错问题:The dependencies of some of the beans in the
    错误如图: 我的是服务器启动服务时报错:***************************APPLICATIONFAILEDTOSTART***************************Description:Thedependenciesofsomeofthebeansintheapplicationcontextformacycle报错原因:两个类相互引用对方,导致Spring在初始化b......