首页 > 编程语言 > 详细

Spring中的循环依赖问题

时间:2021-06-04 22:38:21      阅读:22      评论:0      收藏:0      [点我收藏+]

1、什么是Spring中的循环依赖

  循环依赖就是循环引用,就是两个或多个bean相互之间的持有对方,比如CircleA引用CircleB,CircleB引用CircleC,CircleC引用CircleA,则它们最终反映为一个环

技术分享图片

循环依赖的Error演示

Spring中分为两种情况

 1)构造器循环依赖、

此依赖是无法解决的,只能抛出BeanCurrentlyIn ,CreationException异常表示循环依赖。如在创建TestA类时,构造器需要TestB类,那将去创建TestB,在创建TestB类时又发现需要TestC类,则又去创建TestC,最终在创建TestC时发现又需要TestA,从而形成一个环,没办法创建。

Spring容器将每一个正在创建的bean标识符放在一个“当前创建bean池”中,bean标识符在创建过程中将一直保持在这个池中,因此如果在创建bean过程中发现自己已经在“当前创建bean池”里时,将抛出BeanCurrentlyInCreationException异常表示循环依赖;而对于创建完毕的bean将从“当前创建bean池”中清除掉

通过原生JavaSE代码演示:

技术分享图片

 2)setter循环依赖

对于setter注入造成的依赖是通过Spring容器提前暴露刚完成构造器注入但未完成其他步骤(如setter注入)的bean来完成的,而且只能解决单例作用域的bean循环依赖。

我们都知道Spring中Bean的作用域(scope)默认是Single,就是说在整个bean中他们共享的是一个对象,理论来说是不会出现循环依赖的:

  • 第一种默认(Singleton):

DemoA

/**
 * @author zhangzhixi
 * @date 2021-6-4 19:45
 */
public class DemoA {
    private DemoB demoB;

    public DemoB getDemoB() {
        return demoB;
    }

    public void setDemoB(DemoB demoB) {
        this.demoB = demoB;
    }
} 

DemoB

/**
 * @author zhangzhixi
 * @date 2021-6-4 19:45
 */
public class DemoB {
    private DemoA demoA;

    public DemoA getDemoA() {
        return demoA;
    }

    public void setDemoA(DemoA demoA) {
        this.demoA = demoA;
    }
}

Bean

技术分享图片

 

 

 测试:(正常) 

@Test
public void test1() {
    ApplicationContext applicationContext = new ClassPathXmlApplicationContext("application.xml");
    DemoA a = applicationContext.getBean("a", DemoA.class);
    DemoB b = applicationContext.getBean("b", DemoB.class);
}
  • 第二种原型:(protype):

修改bean的作用域为:protype,我们再进行一个测试~

技术分享图片

 

 报错:

技术分享图片

 2、怎么解决Spring中的循环依赖

 

Spring中的循环依赖问题

原文:https://www.cnblogs.com/zhangzhixi/p/14851274.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!