一、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