zoukankan      html  css  js  c++  java
  • spirng循环依赖

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

    此处不是循环调用,循环调用是方法之间的循环调用。循环调用是无法解决的,除非有终结条件,否则就是死循环,最终导致内存溢出错误。

    2.spring解决循环依赖。

     spring有两种循环依赖:构造器循环依赖和setter循环依赖。

    循环引用类定义:

    public class TestA {

    private TestB testB;

    public void a() {
    testB.b();
    }

    public TestB getTestB() {
    return testB;
    }

    public void setTestB(TestB testB) {
    this.testB = testB;
    }
    }


    public class TestB {
    private TestC testC;

    public void b() {
    testC.c();
    }

    public TestC getTestC() {
    return testC;
    }

    public void setTestC(TestC testC) {
    this.testC = testC;
    }
    }
    public class TestC {

    private TestA testA;

    public void c(){
    testA.a();
    }

    public TestA getTestA() {
    return testA;
    }

    public void setTestA(TestA testA) {
    this.testA = testA;
    }
    }

    (1)、构造器循环依赖

      表示通过构造器注入构成的循环依赖,此依赖是无法解决的,只能抛出BeanCurrentlyInCreationException异常表示循环依赖。

    spring容器将每一个正在创建的bean标识符放在一个“当前创建bean池”中,bean标识符在创建过程中将一直保持在这个池中,因此如果在创建bean的过程中发现自己已经在“当前创建bean池”里,将抛出BeanCurrentlyInCreationException异常表示循环依赖,

    当前创建的bean在池中删除。

    (2)、setter循环依赖

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

    引用到该bean。

  • 相关阅读:
    CF741C.Arpa’s overnight party and Mehrdad’s silent entering [构造 二分图染色]
    CF719E. Sasha and Array [线段树维护矩阵]
    洛谷7月月赛
    CF666B. World Tour
    BZOJ4668: 冷战 [并查集 按秩合并]
    水题练习 2
    CF715B. Complete The Graph
    关于最短路、负环、差分约束系统的一点笔记
    关于最小生成树,拓扑排序、强连通分量、割点、2-SAT的一点笔记
    hdu1814 Peaceful Commission
  • 原文地址:https://www.cnblogs.com/sun-sun/p/10521334.html
Copyright © 2011-2022 走看看