基于构造器注入(Constructor-based DI)
// A.java
@Component
public class A {
private final B b;
public A(B b) {
this.b = b;
}
}
官方推荐的构造器注入写法,不允许出现循环依赖,否则会报错:
Caused by: org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name 'a': Requested bean is currently in creation: Is there an unresolvable circular reference?
我们可以通过另外两种写法解决该问题。
基于 Setter 的注入(Setter-based DI)
// A.java
@Component
public class A {
private B b;
public void setB(B b) {
this.b = b;
}
}
// B.java
@Component
public class B {
private A a;
public void setA(A a) {
this.a = a;
}
}
支持循环引用。
基于注解(@Autowired
)的注入
// A.java
@Component
public class A {
@Autowired
private final B b;
}
// B.java
@Component
public class B {
private final A a;
@Autowired
public void foo(A a) {
this.a = a;
}
}
是不是很方便?
更多内容可以参考 官方文档 。