Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java CDI:@Inject在使用@PostConstruct时未失败_Java_Ejb_Cdi - Fatal编程技术网

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();
   }


}