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 ;

}

相关推荐
云烟成雨TD8 小时前
Spring AI Alibaba 1.x 系列【62】时光旅行(Time-Travel)
java·人工智能·spring
卷毛的技术笔记9 小时前
Java后端硬核实战:用Spring AI Alibaba+Redis给LLM装上“超强记忆中枢”
java·人工智能·redis·后端·spring·ai·系统架构
北漂人Java10 小时前
SpringAI-2.Spring AI整合本地模型和云端大模型
java·spring
java1234_小锋11 小时前
利用Cursor AI编程 两小时实现 基于Spring AI 2.0的带智能客服的商城系统(带在线支付功能)
人工智能·spring·ai编程·智能客服·spring ai·ai智能客服
weixin1997010801614 小时前
[特殊字符] 从1688接口设计,学习高可用API的最佳实践(附Python源码)
python·学习·spring
happyprince14 小时前
05-Hugging Face Transformers 缓存系统深度分析
java·spring·缓存
cg.family15 小时前
Spring生态启动过程
spring
invicinble17 小时前
对于spring的bean应该有哪些领域的认识
java·后端·spring
用户3983461612018 小时前
Go-Spring 实战第 11 课 —— 依赖注入的目标:单 Bean 注入和集合注入
spring·go
梵得儿SHI18 小时前
SpringCloud 进阶拓展:Spring Security OAuth2+JWT 微服务统一认证授权全实战|生产级方案 + 源码解析 + 踩坑实录
spring·spring cloud·微服务·spring security·jwt·oauth2·统一认证授权