【发布时间】:2015-03-25 16:02:27
【问题描述】:
我希望 Spring 在调用 @PostConstruct 方法时会考虑 @DependsOn,但在存在循环(自动连接)依赖项时似乎并非如此。
考虑两个 bean(下面的代码)BeanB @DependsOn BeanA。当字段BeanA#b 将其@Autowired 注释掉时,按预期顺序调用构造后方法:首先是A,然后是B。但是@Autowired 对A 有效,我首先调用了B 的post,然后 A的post。
我知道这是一个糟糕的设计(实际上,它是非常大的 @Autowired ... 代码库的最小演示),但我期待 Spring 完成 @Autowired 字段的注入,然后 em> 开始调用生命周期回调,尊重@DependsOn,但是当有循环依赖时,Spring 似乎忽略了@DependsOn 顺序。
Spring 版本是 4.1.5。
那么,这是我的误解或未记录的行为还是可以将其视为Spring错误(或者,也许是功能请求)?
@Component
class BeanA {
// @Autowired
private BeanB b;
void f() {
System.out.println(this);
}
@PostConstruct
void post() {
System.out.println("A done");
}
@Override
public String toString() {
return "Bean{" +
"b=" + (b == null ? null : b.getClass()) +
'}';
}
}
// ---------------------
@Component
@DependsOn("beanA")
class BeanB {
@Autowired
private BeanA a;
void f() {
System.out.println(this);
}
@PostConstruct
void post() {
System.out.println("B done");
}
@Override
public String toString() {
return "BeanB{" +
"a=" + (a == null ? null : a.getClass()) +
'}';
}
}
【问题讨论】: