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 ;

}

相关推荐
小许学java3 小时前
Spring事务和事务传播机制
java·数据库·spring·事务
这是程序猿5 小时前
基于java的ssm框架经典电影推荐网站
java·开发语言·spring boot·spring·经典电影推荐网站
jiayong235 小时前
海外求职平台与策略指南
java·spring
SadSunset5 小时前
(37)全注解式开发AOP
java·spring
子超兄6 小时前
Bean生命周期
java·spring
Mr.朱鹏6 小时前
超时订单处理方案实战指南【完整版】
java·spring boot·redis·spring·rabbitmq·rocketmq·订单
Lisonseekpan7 小时前
RBAC 基于角色的访问控制模型详解与实践指南
java·服务器·网络·后端·spring·log4j
while(1){yan}8 小时前
计算器和登录界面(实现前后端互通)
spring boot·spring·servlet·java-ee·tomcat·maven
爱吃山竹的大肚肚9 小时前
Spring Boot 与 Apache POI 实现复杂嵌套结构 Excel 导出
java·spring boot·后端·spring·spring cloud·excel
SadSunset9 小时前
(35)使用Spring的AOP
java·数据库·spring