在下面的示例中,我需要为Bean2分配Bean1的属性。该属性为null
(请参见下文)。另外,“ @ PostConstruct Bean2”在“分配后”之前打印。
在分配Bean1中的值之前,是否有办法确保已创建Bean2实例?
@Stateless
public class Bean1 {
@Inject
private Bean2 bean2;
String x;
@PostConstruct
private void init() {
x = "Some Value";
System.out.println("Before assignment");
bean2.setX(x);
System.out.println("After assignment");
}
}
@Stateless
public class Bean2 {
private String x;
public setX(String x) {
this.x = x;
}
@PostConstruct
private void init() {
System.out.println("@PostConstruct Bean2");
System.out.println(x); // <-- x is null
}
}
答案 0 :(得分:0)
根据您的设置方式,这是预期的行为。在整个applicationContext旋转后,应在x
中正确设置Bean2
。
要了解发生了什么,请注意Bean2
是Bean1
的依赖项。这意味着在创建之后 Bean1
之前,Spring无法构造Bean2
。因此,它首先创建了Bean2
,并且您看到x
在init()
块中为空,因为尚未构建Bean1
来设置其值。 / p>
稍后,将构造Bean1
,将调用其init()
方法,并且将正确设置x
中Bean2
的值。但这发生在Bean2
的{{1}}完成之后很久。