interview
spring
什么是循环依赖(常问)?

Spring面试题, 什么是循环依赖常问?

Spring面试题, 什么是循环依赖常问?

QA

Step 1

Q:: 什么是循环依赖?

A:: 循环依赖是指在两个或多个 Bean 之间存在相互依赖的情况。例如,Bean A 依赖于 Bean B,而 Bean B 又依赖于 Bean A。在 Spring 中,如果不加以处理,循环依赖会导致 StackOverflowError 或无法正常初始化 Bean。Spring 通过三级缓存机制(SingletonFactories, EarlySingletons, Singletons)来解决大部分循环依赖问题。

Step 2

Q:: Spring 如何解决循环依赖?

A:: Spring 通过三级缓存机制来解决循环依赖问题。一级缓存(Singletons)存储完全初始化的单例对象,二级缓存(EarlySingletons)存储早期暴露的单例对象,三级缓存(SingletonFactories)存储可以生成单例对象的工厂。在创建一个单例 Bean 时,首先会将它的工厂放入三级缓存,然后尝试实例化它的依赖对象。如果依赖对象也依赖于它,就会从三级缓存中获取早期暴露的单例对象,避免循环依赖问题。

Step 3

Q:: 什么是三级缓存机制?

A:: 三级缓存机制是 Spring 用来解决循环依赖问题的一种方法。一级缓存是单例缓存(Singletons),存储完全初始化的单例对象;二级缓存是早期单例缓存(EarlySingletons),存储部分初始化但尚未完全初始化的单例对象;三级缓存是单例工厂缓存(SingletonFactories),存储用于创建单例对象的工厂。通过这三级缓存,Spring 能够在创建 Bean 的过程中解决循环依赖问题。

用途

在实际生产环境中,循环依赖可能会导致应用程序无法正常启动或运行,特别是在依赖复杂且 Bean 数量众多的情况下。了解和解决循环依赖问题对于确保 Spring 应用程序的稳定性和可维护性至关重要。面试中常问这个问题是为了评估候选人对 Spring 框架的深入理解,以及处理复杂依赖关系的能力。\n

相关问题

🦆
Spring 中的 Bean 生命周期是什么样的?

Spring 中的 Bean 生命周期包括实例化(Instantiation)、属性赋值(Populate)、初始化(Initialization)、销毁(Destruction)等阶段。Bean 的生命周期由 Spring 容器全权管理,可以通过实现 InitializingBean 和 DisposableBean 接口,或使用 @PostConstruct 和 @PreDestroy 注解来自定义初始化和销毁方法。

🦆
什么是 Spring 中的依赖注入DI?

依赖注入(Dependency Injection,DI)是 Spring 框架的核心概念之一,通过外部配置(XML 文件、注解或 Java 配置类)将对象的依赖关系注入到对象中。依赖注入可以减少对象之间的耦合,提高代码的可测试性和可维护性。

🦆
什么是 Spring 的 IoC 容器?

IoC 容器是 Spring 框架的核心组件之一,它负责管理对象的生命周期和依赖关系。IoC 容器通过依赖注入将对象的依赖关系注入到对象中,并提供对象的实例化、配置、组装和管理功能。常见的 IoC 容器实现有 ApplicationContext 和 BeanFactory。

🦆
什么是 Spring 中的 AOP?

面向切面编程(Aspect-Oriented Programming,AOP)是 Spring 框架的一个重要特性,它通过在不修改代码的情况下增强现有代码的功能。AOP 可以用于日志记录、事务管理、安全检查等横切关注点。Spring AOP 通过定义切点(Pointcut)和增强(Advice)来实现这些功能。