面试题:Spring如何解决循环依赖?

简介: 面试题:Spring如何解决循环依赖?

面试题:Spring如何解决循环依赖?

作为面试者,我很乐意分享关于Spring如何解决循环依赖的问题。

Spring框架中,如果两个Bean之间存在相互依赖的关系,并且这种依赖是循环的,则可能会导致无法创建完整的对象图和出现循环依赖异常。为了解决这种类型的问题,Spring使用了两种技术:构造函数参数注入和三级缓存(三级缓存又称“早期对象”的缓存)。

  1. 构造函数参数注入

对于通过构造函数进行自动装配的Bean之间的循环依赖,可以使用构造函数参数注入来解决。Spring容器将创建Bean时所需的全部依赖项注入到构造函数中,并使用代理对象封装正在创建的Bean,从而避免了循环依赖。例如:

public class ProductService {
    private final ProductRepository productRepository;
    public ProductService(ProductRepository productRepository) {
        this.productRepository = productRepository;
    }
}
public class ProductRepository {
    private final ProductService productService;
    public ProductRepository(ProductService productService) {
        this.productService = productService;
    }
}

在上述代码中,ProductService依赖于ProductRepository,而ProductRepository又依赖于ProductService。由于它们的依赖关系是循环的,因此可以使用构造函数注入来解决。

  1. 三级缓存技术

当Bean之间的循环依赖问题无法通过构造函数来处理时,Spring使用三级缓存来解决此类问题。在第一阶段,当创建一个Bean对象后,会先判断这个Bean是否已经缓存在singletonObjects这个单例池中了,如果是直接拿出来返回,如果没有就进入到第二阶段。在第二阶段,会将当前正在创建的Bean放入earlySingletonObjects这个早期单例列表中并设置其状态为“正在创建中”,然后继续创建其所依赖的其他Bean。在依赖的其他Bean都创建好后,在开始对当前Bean进行初始化之前,会将早期单例池中所有状态为“正在创建中”的Bean都提前暴露(替换)成代理对象,并更新它们的状态为“已创建”。由此,在对Bean进行初始化的过程中,该Bean从早期单例列表中获取到的代理对象,以满足该Bean对其它Bean的依赖,从而避免了循环依赖异常的发生。

总之,Spring框架可以通过构造函数参数注入与三级缓存技术来处理Bean之间相互依赖、且嵌套或循环的情况,保证依赖关系传递的正确性及完整性,从而符合java设计模式重要的“解耦”思想。

相关文章
|
8天前
|
人工智能 Java Spring
Spring Boot循环依赖的症状和解决方案
Spring Boot循环依赖的症状和解决方案
|
14天前
|
Java Spring
Spring面试题pro版-5
Spring面试题pro版-5
14 0
|
14天前
|
Java Spring
Spring面试题pro版-4
Spring面试题pro版-4
14 0
|
14天前
|
XML Java 数据格式
Spring面试题pro版-3
Spring面试题pro版-3
29 0
|
14天前
|
设计模式 Java 数据库
Spring面试题系列-4
Spring面试题系列-4
19 1
|
4天前
|
存储 缓存 Java
【Spring系列笔记】依赖注入,循环依赖以及三级缓存
依赖注入: 是指通过外部配置,将依赖关系注入到对象中。依赖注入有四种主要方式:构造器注入、setter方法注入、接口注入以及注解注入。其中注解注入在开发中最为常见,因为其使用便捷以及可维护性强;构造器注入为官方推荐,可注入不可变对象以及解决循环依赖问题。本文基于依赖注入方式引出循环依赖以及三层缓存的底层原理,以及代码的实现方式。
15 0
|
8天前
|
存储 缓存 Java
【spring】06 循环依赖的分析与解决
【spring】06 循环依赖的分析与解决
6 1
|
14天前
|
设计模式 安全 Java
Spring面试题pro版-6
Spring面试题pro版-6
16 0
|
14天前
|
缓存 Java Spring
Spring面试题pro版-2
Spring面试题pro版-2
12 0
|
14天前
|
Java 数据库连接 API
Spring面试题pro版-1
Spring面试题pro版-1
15 0