Spring 如何解决循环依赖问题?

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

循环依赖问题在 Spring 中有三种情况:

(1)通过构造方法进行依赖注入时产生的循环依赖问题

(2)通过 setter 方法进行依赖注入时且是在多例模式下产生的循环依赖问题

(3)通过 setter 方法进行依赖注入且是在单例模式下产生的循环依赖问题

在 spring 中只有第(3)种方式的循环依赖问题被解决了,其他两种方式在遇到循环依赖问题时都会产生异常,这是因为:

第一种:构造方法注入产生的循环依赖:当多个对象之间存在循环的引用关系时(也就是 A 类中注入 B 对象,同时 B 类中注入 A 对象),在初始化过程中,就会出现 “先有鸡还是先有蛋” 的问题。

@Lazy 注解:在构造方法上加上 @Lazy 注解解决构造方法造成的循环依赖问题。(本质上就是懒加载,先加载一个后加载一个)

第二种:setter 方法(多例)的情况下,每一次获取 bean 时就会产生一个新的 bean,一直下去就会产生无数的 Bean,最终会导致 OOM(内存溢出)问题的出现

Spring 在单例模式下的 setter 方法注入引起的循环依赖问题,主要是通过二级缓存和三级缓存来解决的,其中三级缓存是主要贡献者。

二级缓存会保存 new 出来的不完整的对象,这样当单例池中找不到依赖的属性时,就可以先从二级缓存中获取到不完整的对象并完成对象创建,然后在后续的依赖注入过程中将单例池中对象的引用关系调整完成。

三级缓存中,如果引用的对象配置了 AOP,那在单例池中最终就会需要注入动态代理对象而不是原对象。而生成动态代理是要在对象初始化完成之后才开始的。所以 Spring 增加三级缓存,保存所有对象的动态代理配置信息。在发现有循环依赖时,会将这个对象的动态代理信息获取出来,提前进行 AOP,生成动态代理。

相关文章
|
1天前
|
人工智能 Java Spring
Spring Boot循环依赖的症状和解决方案
Spring Boot循环依赖的症状和解决方案
|
1天前
|
缓存 Java 开发工具
【spring】如何解决循环依赖
【spring】如何解决循环依赖
13 0
|
1天前
|
存储 缓存 Java
【Spring系列笔记】依赖注入,循环依赖以及三级缓存
依赖注入: 是指通过外部配置,将依赖关系注入到对象中。依赖注入有四种主要方式:构造器注入、setter方法注入、接口注入以及注解注入。其中注解注入在开发中最为常见,因为其使用便捷以及可维护性强;构造器注入为官方推荐,可注入不可变对象以及解决循环依赖问题。本文基于依赖注入方式引出循环依赖以及三层缓存的底层原理,以及代码的实现方式。
24 0
|
1天前
|
存储 缓存 Java
【spring】06 循环依赖的分析与解决
【spring】06 循环依赖的分析与解决
9 1
|
1天前
|
存储 缓存 Java
Spring解决循环依赖
Spring解决循环依赖
|
1天前
|
Java 应用服务中间件 Maven
SpringBoot 项目瘦身指南
SpringBoot 项目瘦身指南
56 0
|
1天前
|
缓存 安全 Java
Spring Boot 面试题及答案整理,最新面试题
Spring Boot 面试题及答案整理,最新面试题
138 0
|
1天前
|
存储 JSON Java
SpringBoot集成AOP实现每个接口请求参数和返回参数并记录每个接口请求时间
SpringBoot集成AOP实现每个接口请求参数和返回参数并记录每个接口请求时间
46 2
|
1天前
|
前端开发 搜索推荐 Java
【Spring底层原理高级进阶】基于Spring Boot和Spring WebFlux的实时推荐系统的核心:响应式编程与 WebFlux 的颠覆性变革
【Spring底层原理高级进阶】基于Spring Boot和Spring WebFlux的实时推荐系统的核心:响应式编程与 WebFlux 的颠覆性变革
|
1天前
|
前端开发 Java 应用服务中间件
Springboot对MVC、tomcat扩展配置
Springboot对MVC、tomcat扩展配置