Java CDI:@Inject在使用@PostConstruct时未失败
有人能向我解释为什么第一个和第二个案例失败导致Java CDI:@Inject在使用@PostConstruct时未失败,java,ejb,cdi,Java,Ejb,Cdi,有人能向我解释为什么第一个和第二个案例失败导致NullPointerException,因为b2和/或b3在Bean1的构造函数中仍然是空的,而第三个案例工作正常 在所有情况下都具有此功能: @Stateless public class Bean2 { @Inject private Bean3 b3; public Bean2(){ } } 第一种情况:(失败) 第二种情况:(失败) 第三种情况:(成功) 注入只在bean被实例化之后发生,这发生在构造函数
NullPointerException
,因为b2
和/或b3
在Bean1
的构造函数中仍然是空的,而第三个案例工作正常
在所有情况下都具有此功能:
@Stateless
public class Bean2 {
@Inject
private Bean3 b3;
public Bean2(){
}
}
第一种情况:(失败)
第二种情况:(失败)
第三种情况:(成功)
注入只在bean被实例化之后发生,这发生在构造函数被调用之后,这就是为什么在第一种情况下您有一个NPE 在第二种情况下,您自己实例化了bean b2,这意味着它将不由JavaEE服务器管理(这意味着没有注入),因此ref.b3将为null
在第三种情况下,当调用init方法时,所有构造函数都被调用,bean也被注入 还需要指出的是,
@PostConstruct
方法是一个回调,一旦满足了所有注入点。您可以通过将@Inject
放在接受所有依赖项的构造函数上来模拟这种行为,但您需要自己设置它们。这是一个令人惊讶的答案!谢谢大家!+1.
@Singleton
@StartUp
public class Bean1 {
@Inject
private Bean2 b2;
public Bean1(){
b2.someMethod(); // b2 throws null pointer exception
}
}
@Singleton
@StartUp
public class Bean1 {
private Bean2 b2;
public Bean1(){
b2 = new Bean2();
b2.someMethod(); // b3 throws null pointer exception
}
}
@Singleton
@StartUp
public class Bean1 {
@Inject
private Bean2 b2;
public Bean1(){
}
@PostConstruct
public init(){
b2.someMethod();
}
}