一、Spring 默認(rèn)支持的循環(huán)依賴類型
Spring 通過三級緩存機(jī)制,默認(rèn)支持單例 Bean 的 setter 注入和字段注入形式的循環(huán)依賴,但不支持構(gòu)造函數(shù)注入的循環(huán)依賴。
重點強(qiáng)調(diào):不支持構(gòu)造函數(shù)注入的循環(huán)依賴
二、驗證默認(rèn)開啟循環(huán)依賴支持
以下是一個簡單的示例,展示 Spring 默認(rèn)對循環(huán)依賴的支持:
1、創(chuàng)建兩個相互依賴的 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、創(chuàng)建一個測試類
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 方法注入。當(dāng)你運行 CircularDependencyDemoApplication 時,Spring Boot 應(yīng)用能夠正常啟動,說明默認(rèn)情況下循環(huán)依賴是支持的。
三、禁止或強(qiáng)制開啟循環(huán)依賴
spring:
main:
allow-circular-references: true