在下面的示例中,我需要为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
}
}
这是基于您如何设置的预期行为。在整个applicationContext被旋转之后,x
应该在Bean2
中正确设置。
要了解发生了什么,请注意Bean2
是Bean1
的依赖。这意味着在Bean1
创建之后,Spring无法构建Bean2
。因此它首先创建Bean2
,并且您在x
块中看到init()
为null,因为尚未构造Bean1
以便能够设置其值。
之后,将构建Bean1
,将调用其init()
方法,并且将正确设置x
中Bean2
的值。但这种情况发生在Bean2
的@PostConstruct
已经结束之后很久。