Spring循环依赖

什么是循环依赖?

详细可以参考原文:https://www.zhihu.com/question/438247718/answer/1730527725

这里做简化赘述

循环依赖:说白是一个或多个对象实例之间存在直接或间接的依赖关系,这种依赖关系构成了构成一个环形调用
image

模拟代码如下

@Service
public class TestService1 {

    @Autowired
    private TestService2 testService2;

    public void test1() {
    }
}

@Service
public class TestService2 {

    @Autowired
    private TestService1 testService1;

    public void test2() {
    }
}

经典的循环依赖,但是它能正常运行,得益于spring的内部机制,让我们根本无法感知它有问题,因为spring默默帮我们解决了。

spring内部有三级缓存:

  • singletonObjects 一级缓存,用于保存实例化、注入、初始化完成的bean实例
  • earlySingletonObjects 二级缓存,用于保存实例化完成的bean实例
  • singletonFactories 三级缓存,用于保存bean创建工厂,以便于后面扩展有机会创建代理对象。

下面用一张图告诉你,spring是如何解决循环依赖的:
image

出现循环依赖如何解决?

生成代理对象产生的循环依赖
这类循环依赖问题解决方法很多,主要有:

  1. 使用@Lazy注解,延迟加载
  2. 使用@DependsOn注解,指定加载先后关系
  3. 修改文件名称,改变循环依赖类的加载顺序

参考文章: https://www.zhihu.com/question/438247718/answer/1730527725
原文更详细更全,这里只做基本简化转载。。。。。

posted on 2022-02-13 16:01  白嫖老郭  阅读(38)  评论(0)    收藏  举报

导航