循环依赖
Bean A 依赖 B,Bean B 依赖 A这种情况下出现循环依赖。
原因
spring bean容器,不清楚先注入那个对象,故报错。
当使用构造器注入时经常会发生循环依赖问题。如果使用其它类型的注入方式能够避免这种问题。
解决办法
-
重新设计,避免循环依赖
-
setter注入
@Component
public class A {
private B b;
@Autowired
public void setB(B b) {
this.b = b;
}
public B getB() {
return this.b;
}
}
- @PostConstruct
@Component
public class A {
@Autowired
private B b;
@PostConstruct
public void init() {
circB.setA(this);
}
public B getB() {
return this..b;
}
}
@Component
public class B {
private A a;
public void setA(A a) {
this.a = a;
}
}
- 实现ApplicationContextAware与InitializingBean
@Component
public class A implements ApplicationContextAware, InitializingBean {
private B b;
private ApplicationContext context;
public B getB() {
return this.b;
}
@Override
public void afterPropertiesSet() throws Exception {
b = context.getBean(B.class);
}
@Override
public void setApplicationContext(final ApplicationContext ctx) throws BeansException {
context = ctx;
}
}
QA
- 处理循环依赖的优先级如下。
1.重新设计依赖来避免循环依赖。
2. 优先建议使用setter注入来解决。
3. 再考虑其他方法。