首页 > 其他分享 >如何解决Spring循环依赖?

如何解决Spring循环依赖?

时间:2023-08-07 11:38:03浏览次数:34  
标签:依赖 Spring Component springframework 循环 public 构造函数

在Spring中,循环依赖指的是两个或多个Bean之间相互依赖,形成一个闭环,导致Spring容器无法正确地创建这些Bean。解决Spring循环依赖的方法是通过Spring容器的三个阶段来处理:实例化、属性注入、和初始化。

为了更好地解释,我们假设有两个类A和B相互依赖。A依赖于B,B也依赖于A。以下是解决循环依赖的步骤:

  1. 创建Bean定义(Component Scan或XML配置): 首先,我们需要创建Bean定义,告诉Spring容器如何实例化这两个类。
// Class A
package com.example.demo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class A {
    private B b;

    @Autowired
    public A(B b) {
        this.b = b;
    }
}

// Class B
package com.example.demo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class B {
    private A a;

    @Autowired
    public B(A a) {
        this.a = a;
    }
}
  1. Spring容器实例化Bean: 在这个阶段,Spring容器会尝试实例化A和B,但是它会发现它们互相依赖,形成了循环依赖。
  2. 通过构造函数注入解决循环依赖: 默认情况下,Spring使用构造函数注入来解决循环依赖。Spring容器会创建A的实例并将其注入到B的构造函数中,然后创建B的实例并将其注入到A的构造函数中,完成依赖注入。
  3. 代码示例: 下面是使用Spring解决循环依赖的示例代码:
// Class A
package com.example.demo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class A {
    private B b;

    @Autowired
    public A(B b) {
        this.b = b;
    }
}

// Class B
package com.example.demo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class B {
    private A a;

    @Autowired
    public B(A a) {
        this.a = a;
    }
}

在这个示例中,Class A和Class B相互依赖,但是Spring会通过构造函数注入来解决循环依赖问题。这样,当我们在其他类中注入A或B时,Spring容器会正确地解决它们之间的循环依赖。

需要注意的是,构造函数注入是默认的解决方案。如果你使用其他注入方式(如setter注入),则需要使用@Lazy注解来告诉Spring延迟初始化Bean,以避免循环依赖的问题。但构造函数注入是最推荐的方式,因为它避免了潜在的循环依赖问题。

标签:依赖,Spring,Component,springframework,循环,public,构造函数
From: https://blog.51cto.com/u_16170893/6991929

相关文章

  • Spring Boot 最佳实践
    本文翻译自国外论坛medium,原文地址:https://medium.com/@raviyasas/spring-boot-best-practices-for-developers-3f3bdffa0090SpringBoot是一种广泛使用且非常流行的企业级高性能框架。以下是一些最佳实践和一些技巧,我们可以使用它们来改进SpringBoot应用程序并使其更加高效......
  • Spring常见问题
    一、Spring是什么Spring是一个轻量级的IOC和AOP容器框架。是为Java应用程序提供基础服务的一套框架,目的是简化企业应用程序的开发,它使得开发者只需要关心业务需求。主要包含以下七个模块:1.SpringContext:提供框架式的Bean访问方式,以及企业级功能;2.SpringCore:核心类库,所有功能都......
  • spring-cron定时任务【@Scheduled(cron = “* * * * * *“)】
    1https://blog.csdn.net/HD243608836/article/details/1268862480010,14,16**?每天上午10点,下午2点,4点00/309-17**?朝九晚五工作时间内每半小时0012?*WED表示每个星期三中午12点"0012**?"每天中午12点触发"01510?**"每天上午10:15触发......
  • Mitsubishi 三菱FXPLC学习之子程序调用与循环
    上次,我们学习了程序流程转移中的条件跳转CJ,这次,我们接着向子程序调用CALL和FOR循环发起进攻吧!显然,子程序调用CALL和FOR循环和条件跳转CJ一样,都是PLC程序中用于流程转移的,所以,上次所学的程序区、主程序结束指令FEND等知识点可不要丢哟~在这里我也不再赘述了,这是为了给读者......
  • springcloud 整合sentinel
    一、参考官网:Sentinel·alibaba/spring-cloud-alibabaWiki·GitHub1.搭建sentinelDashborad     1.下载jar包: Releases·alibaba/Sentinel(github.com)     2.启动:java-Dserver.port=8080-Dcsp.sentinel.dashboard.server=localhost:8080-......
  • java 从外部强制结束死循环代码
    publicclassThreadTimeoutExample{publicstaticvoidmain(String[]args){Threadthread=newThread(newMyRunnable());thread.start();//启动线程try{thread.join(3000);//等待线程执行,设置超时时间为3秒......
  • 基于注解的(属性)依赖注入
    依赖注入(DI):说白了就是对于属性的赋值。基于xml的依赖注入有两种:第一种是基于setter方法的属性注入:<propertyname=""value(ref)=""></property>。第二种是基于构造方法的属性注入:<construct-argname=""value(ref)=""></property>上面两种无论是基于setter的bean属性注......
  • 浅尝 JWT 整合到 Spring Boot
    本文,我们将JWT整合到SpringBoot中。JWT是什么?JWT->JSONWebTokenJWT是一种开放标准(RFC7519),用于在网络应用中传递声明信息。JWT到一大优势是它的可扩展性和自包含性。它可以在各个系统之间进行安全传输和验证,因为它包含了所有必要的信息,并且经过签名保证了数据的完整性......
  • Spring Boot + k8s = 王炸!
    来源:https://blog.csdn.net/qq_14999375/article/details/123309636前言K8s+SpringBoot实现零宕机发布:健康检查+滚动更新+优雅停机+弹性伸缩+Prometheus监控+配置分离(镜像复用)配置健康检查健康检查类型:就绪探针(readiness)+存活探针(liveness)探针类型:exec(进入容器执行脚本......
  • Docker部署SpringBoot项目微服务
     登录linux服务器,进入目录  usr/local目录,创建两个文件夹使用alt+p快捷键,将windows目录中生成的jar包,拖到linux桌面使用cp命令,将linux桌面中jar包,复制到指定目录cplesson01-0.0.1-SNAPSHOT.jar/usr/local/docker/lesson01使用vi命令,编辑dockerfile,制作镜......