Spring中为啥要创建三级缓存,二级缓存不就可以解决循环依赖了吗 - 面试宝典

举报
皮牙子抓饭 发表于 2023/08/21 09:24:00 2023/08/21
820 1 1
【摘要】 在Spring中,创建三级缓存的目的是为了解决循环依赖的问题。虽然二级缓存可以解决一部分循环依赖的情况,但是对于复杂的循环依赖场景来说,仅使用二级缓存可能无法完全解决问题。 三级缓存是Spring框架中用于解决循环依赖的一种机制。它包括了singletonObjects、earlySingletonObjects和singletonFactories三个缓存。singletonObjects...

1692493979684309332.png

在Spring中,创建三级缓存的目的是为了解决循环依赖的问题。虽然二级缓存可以解决一部分循环依赖的情况,但是对于复杂的循环依赖场景来说,仅使用二级缓存可能无法完全解决问题。 三级缓存是Spring框架中用于解决循环依赖的一种机制。它包括了singletonObjects、earlySingletonObjects和singletonFactories三个缓存。

  1. singletonObjects缓存用于存储完全初始化完成的单例对象。当一个bean完全初始化完成后,会被放入该缓存中。
  2. earlySingletonObjects缓存用于存储正在创建中但尚未完成初始化的单例对象。当一个bean正在创建过程中,会被放入该缓存中。这样可以在循环依赖时提供一个中间状态,避免循环依赖的死锁情况发生。
  3. singletonFactories缓存用于存储创建bean的工厂对象。当一个bean正在创建过程中,会被放入该缓存中。这样可以在循环依赖时提供一个中间状态,避免循环依赖的死锁情况发生。 通过创建三级缓存,Spring能够在bean的创建过程中解决循环依赖的问题。当一个bean被其他bean所依赖时,Spring会先从singletonObjects缓存中查找,如果找不到则再从earlySingletonObjects缓存中查找,最后再从singletonFactories缓存中查找。这样可以确保循环依赖时仍然能够正确地创建和注入依赖的bean。 总结来说,虽然二级缓存可以解决一些循环依赖的情况,但对于更复杂的场景,Spring通过创建三级缓存来提供更细粒度的控制,确保循环依赖时能够正确地创建和注入依赖的bean。

下面是一个简单的示例代码,演示了Spring中的循环依赖和三级缓存的使用:

javaCopy codeimport org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class A {
    private B b;
    @Autowired
    public A(B b) {
        this.b = b;
    }
    public void doSomething() {
        System.out.println("A is doing something.");
    }
}
@Component
public class B {
    private A a;
    @Autowired
    public B(A a) {
        this.a = a;
    }
    public void doSomething() {
        System.out.println("B is doing something.");
    }
}
public class Main {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
        context.register(A.class, B.class);
        context.refresh();
        A a = context.getBean(A.class);
        a.doSomething();
        B b = context.getBean(B.class);
        b.doSomething();
    }
}

在这个例子中,类A和类B相互依赖,即A依赖于B,B依赖于A。Spring通过自动注入的方式解决循环依赖。在类A的构造方法中注入了B的实例,在类B的构造方法中注入了A的实例。 当我们运行Main类时,Spring容器会创建A和B的实例,并自动解决它们之间的循环依赖。Spring会使用三级缓存来管理A和B的创建过程,确保它们在循环依赖时能够正确地创建和注入依赖。 输出结果可能类似于:

plaintextCopy codeB is doing something.
A is doing something.

这表明A和B都成功地创建并执行了它们的方法。通过使用三级缓存,Spring能够正确地解决循环依赖的问题。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(1

抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。