SpringBoot 开启支持循环依赖

一、Spring 默认支持的循环依赖类型

Spring 通过三级缓存机制,默认支持单例 Bean 的 setter 注入和字段注入形式的循环依赖,但不支持构造函数注入的循环依赖。

重点强调:不支持构造函数注入的循环依赖

二、验证默认开启循环依赖支持

以下是一个简单的示例,展示 Spring 默认对循环依赖的支持:

1、创建两个相互依赖的 Bean 类

import org.springframework.stereotype.Component;

@Component
public class BeanA {
    private BeanB beanB;

    // 使用setter方法注入
    public void setBeanB(BeanB beanB) {
        this.beanB = beanB;
    }

    public BeanB getBeanB() {
        return beanB;
    }
}

@Component
public class BeanB {
    private BeanA beanA;

    // 使用setter方法注入
    public void setBeanA(BeanA beanA) {
        this.beanA = beanA;
    }

    public BeanA getBeanA() {
        return beanA;
    }
}

2、创建一个测试类

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class CircularDependencyDemoApplication implements CommandLineRunner {

    @Autowired
    private BeanA beanA;

    @Autowired
    private BeanB beanB;

    public static void main(String[] args) {
        SpringApplication.run(CircularDependencyDemoApplication.class, args);
    }

    @Override
    public void run(String... args) throws Exception {
        System.out.println("BeanA's BeanB: " + beanA.getBeanB());
        System.out.println("BeanB's BeanA: " + beanB.getBeanA());
    }
}

在上述代码中,BeanA 和 BeanB 相互依赖,通过 setter 方法注入。当你运行 CircularDependencyDemoApplication 时,Spring Boot 应用能够正常启动,说明默认情况下循环依赖是支持的。

三、禁止或强制开启循环依赖

spring:
  main:
    allow-circular-references: true
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容