Spring 如何解决 Bean 的循环依赖(循环引用)

简介: Spring 如何解决 Bean 的循环依赖(循环引用)
@Component
public class A {
    @Autowired
    private B b;
}
@Component
public class B {
    @Autowired
    private A a;
}

上面的情况就是 循环依赖

Bean的创建初始化过程如下

如果不采取措施,那么循环依赖就会进入死循环

但 Spring 已经帮我们解决了大部分循环依赖问题

具体是如何解决的?

Spring解决循环依赖是通过三级缓存,对应的三级缓存如下所示:

缓存名称

源码名称

作用

一级缓存

singletonObjects

单例池,缓存已经经历了完整的生命周期,已经初始化完成的bean对象

二级缓存

earlySingletonObjects

缓存早期的bean对象(生命周期还没走完)

三级缓存

singletonFactories

缓存的是ObjectFactory,表示对象工厂,用来创建某个对象的

下图是Bean的生命周期,我们依照Bean的生命周期来说明,关于Bean的生命周期可以参考我的另外一篇博客

一级缓存 存放 已经全部完成的Bean,可以直接使用

二级缓存 存放 早期的bean对象,其生命周期还没走完,也就是仅通过构造函数创建出实例,但未进行依赖注入及其以下初始化步骤

三级缓存 存放 对象工厂,对象工厂用于创建对象,其具体作用下面会说明

实际上 一级 和 二级 缓存就能解决一般的 循环依赖问题


但是 如果一个对象被增强了,即 是个代理对象, 这个时候就需要一个三级缓存

但是 仍有些循环引用 Spring 解决不了,这时候需要手动解决,最典型的就是 构造方法出现了循环依赖,如下

@Component
public class A {
    // B成员变量
    private B b;
    public A(B b){
        System.out.println("A的构造方法执行了...");
        this.b = b ;
    }
}
@Component
public class B {
    // A成员变量
    private A a;
    public B(A a){
        System.out.println("B的构造方法执行了...");
        this.a = a ;
    }
}

解决办法 -- 延迟加载:

1. public A(@Lazy B b){
2.     System.out.println("A的构造方法执行了...");
3. this.b = b ;
4. }


Water
+关注
目录
打赏
0
0
0
0
8
分享
相关文章
Spring IOC—基于注解配置和管理Bean 万字详解(通俗易懂)
Spring 第三节 IOC——基于注解配置和管理Bean 万字详解!
157 26
微服务——SpringBoot使用归纳——Spring Boot集成Thymeleaf模板引擎——依赖导入和Thymeleaf相关配置
在Spring Boot中使用Thymeleaf模板,需引入依赖`spring-boot-starter-thymeleaf`,并在HTML页面标签中声明`xmlns:th="http://www.thymeleaf.org"`。此外,Thymeleaf默认开启页面缓存,开发时建议关闭缓存以实时查看更新效果,配置方式为`spring.thymeleaf.cache: false`。这可避免因缓存导致页面未及时刷新的问题。
15 0
微服务——SpringBoot使用归纳——Spring Boot集成 Swagger2 展现在线接口文档——Swagger2 的 maven 依赖
在项目中使用Swagger2工具时,需导入Maven依赖。尽管官方最高版本为2.8.0,但其展示效果不够理想且稳定性欠佳。实际开发中常用2.2.2版本,因其稳定且界面友好。以下是围绕2.2.2版本的Maven依赖配置,包括`springfox-swagger2`和`springfox-swagger-ui`两个模块。
12 0
【Spring】获取Bean对象需要哪些注解
@Conntroller,@Service,@Repository,@Component,@Configuration,关于Bean对象的五个常用注解
101 12
【Spring】IoC和DI,控制反转,Bean对象的获取方式
IoC,DI,控制反转容器,Bean的基本常识,类注解@Controller,获取Bean对象的常用三种方式
Spring容器Bean之XML配置方式
通过对以上内容的掌握,开发人员可以灵活地使用Spring的XML配置方式来管理应用程序的Bean,提高代码的模块化和可维护性。
92 6
🌱 深入Spring的心脏:Bean配置的艺术与实践 🌟
本文深入探讨了Spring框架中Bean配置的奥秘,从基本概念到XML配置文件的使用,再到静态工厂方式实例化Bean的详细步骤,通过实际代码示例帮助读者更好地理解和应用Spring的Bean配置。希望对你的Spring开发之旅有所助益。
236 4
Spring容器中的bean是线程安全的吗?
Spring容器中的bean默认为单例模式,多线程环境下若操作共享成员变量,易引发线程安全问题。Spring未对单例bean做线程安全处理,需开发者自行解决。通常,Spring bean(如Controller、Service、Dao)无状态变化,故多为线程安全。若涉及线程安全问题,可通过编码或设置bean作用域为prototype解决。
61 1
|
7天前
|
基于SpringBoot的Redis开发实战教程
Redis在Spring Boot中的应用非常广泛,其高性能和灵活性使其成为构建高效分布式系统的理想选择。通过深入理解本文的内容,您可以更好地利用Redis的特性,为应用程序提供高效的缓存和消息处理能力。
111 79
微服务——SpringBoot使用归纳——Spring Boot集成Thymeleaf模板引擎——Thymeleaf 的使用
本文介绍了 Thymeleaf 在 Spring Boot 项目中的使用方法,包括访问静态页面、处理对象和 List 数据、常用标签操作等内容。通过示例代码展示了如何配置 404 和 500 错误页面,以及如何在模板中渲染对象属性和列表数据。同时总结了常用的 Thymeleaf 标签,如 `th:value`、`th:if`、`th:each` 等,并提供了官方文档链接以供进一步学习。
16 0
微服务——SpringBoot使用归纳——Spring Boot集成Thymeleaf模板引擎——Thymeleaf 的使用

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等