Spring 如何解决循环依赖?Spring三级缓存

什么是循环依赖

说白是一个或多个对象实例之间存在直接或间接的依赖关系,这种依赖关系构成了构成一个环形调用。

自己依赖自己

两个对象间的依赖关系

多个对象间的依赖关系

Spring出现循环依赖的场景

单例的setter注入

java 复制代码
@Service
public class A {
    @Resource
    private B b;
    
    public void test1(){
        
    }
}
java 复制代码
@Service
public class B {
    @Resource
    private A a;

    public void test2(){

    }

}

这是一个典型的循环依赖问题,但是Spring已经帮我们解决了,所以我们无法察觉到问题

Spring内部有三级缓存:

一级缓存:singletonObjects,用于保存实例化、初始化完成的bean

一级缓存作用:限制bean在beanFactory中只存一份,即实现singleton scope,解决不了循环依赖

如果要想打破循环依赖, 就需要一个中间人的参与, 这个中间人就是二级缓存。

二级缓存:earlySingletonObjects,用于保存实例化完成的bean实例

三级缓存:singletonObjects,用于保存bean的创建工厂,以便于后面有机会创建代理对象

Spring三级缓存间的关系

构造方法出现了循环依赖怎么解决?

原因:由于bean的生命周期中构造函数是第一个执行的,spring框架并不能解决构造函数的的依赖注入

可以通过**@Lazy**注解解决,什么时候需要对象再进行bean对象的创建

public A(@Lazy B b){

System.out.println("A的构造方法执行了...");

this.b = b ;

}

相关推荐
计算机学姐10 分钟前
基于SpringBoot的网吧管理系统
java·spring boot·后端·spring·tomcat·intellij-idea·mybatis
Boop_wu12 分钟前
[Java EE 进阶] SpringBoot 配置文件全解析:properties 与 yml 的使用(1)
java·spring boot·spring·java-ee
百锦再10 小时前
Java 并发编程进阶,从线程池、锁、AQS 到并发容器与性能调优全解析
java·开发语言·jvm·spring·kafka·tomcat·maven
NGC_661112 小时前
SSM vs SpringBoot+MyBatis 对比
spring
深蓝轨迹14 小时前
@Autowired与@Resource:Spring依赖注入注解核心差异剖析
java·python·spring·注解
爱丽_14 小时前
Pinia 状态管理:模块化、持久化与“权限联动”落地
java·前端·spring
希望永不加班15 小时前
SpringBoot 核心配置文件:application.yml 与 application.properties
java·spring boot·后端·spring
我真会写代码16 小时前
Spring面试高频题:从基础到源码,通俗拆解+避坑指南
java·spring·面试
cyforkk20 小时前
Spring AOP 核心揭秘:ProceedingJoinPoint 与反射机制详解
java·python·spring
spencer_tseng1 天前
java.lang.ClassNotFoundException: org.slf4j.Logger
java·spring·maven