关于spring循环依赖的一点小感悟

首先,spring是支持setter循环依赖的,但是不支持基于构造函数的循环依赖注入。一直不太明白其中原理,直到看到官方文档中的这么一段话

Unlike the typical case (with no circular dependencies), a circular dependency between bean A and bean B forces one of the beans to be injected into the other prior to being fully initialized itself (a classic chicken-and-egg scenario).

大概意思就是说,对于A和B之间的循环依赖,会强制使另一个bean注入一个未完全初始化完成的自己。

提出假设

  • 既然是未初始化完成的bean,那其被注入的时候生命周期方法init-method就是应该未被执行过的。
  • A和B,谁会注入一个未初始化完成的依赖呢?如果A先注册,则B在查找依赖注入的A应该是一个未完全初始化的A。

话不多说,上代码

1、创建两个bean互相依赖

class A{

    public A(){
        System.out.println("开始创建a");
    }
    private B b;

    @Autowired
    public void setB(B b){
        System.out.println("b 被注入!");
        this.b=b;
    }

    @PostConstruct
    public void init(){
        System.out.println("a 初始化完成!");
    }
}

class B{
    public B(){
        System.out.println("开始创建b");
    }
    private A a;
    @Autowired
    public void setA(A a){
        System.out.println("a 被注入!");
        this.a=a;
    }
    @PostConstruct
    public void init(){
        System.out.println("b初始化完成!");
    }

}
复制代码

2、启动容器

AnnotationConfigApplicationContext context=new AnnotationConfigApplicationContext();
    context.register(A.class);
    context.register(B.class);
    context.refresh();
复制代码

原文 

https://juejin.im/post/5e8b1b2451882573a509a27f

本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。

PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » 关于spring循环依赖的一点小感悟

赞 (0)
分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址