CDI:@Inject在使用@PostConstruct时没有失败

2 java ejb cdi

任何人都可以向我解释为什么第一个和第二个案例失败导致NullPointerException因为b2和/或b3在构造函数中仍然为空Bean1,当第三种情况正常时.

在所有情况下都有:

@Stateless
public class Bean2 {

   @Inject
   private Bean3 b3; 

   public Bean2(){

   }

}
Run Code Online (Sandbox Code Playgroud)

第一种情况:(失败)

@Singleton
@StartUp
public class Bean1 {

   @Inject
   private Bean2 b2;

   public Bean1(){
     b2.someMethod(); // b2 throws null pointer exception
   }

}
Run Code Online (Sandbox Code Playgroud)

第二种情况:(失败)

@Singleton
@StartUp
public class Bean1 {

   private Bean2 b2;

   public Bean1(){
     b2 = new Bean2();
     b2.someMethod(); // b3 throws null pointer exception
   }

}
Run Code Online (Sandbox Code Playgroud)

第三种情况:(成功)

@Singleton
@StartUp
public class Bean1 {

   @Inject
   private Bean2 b2;

   public Bean1(){

   }

   @PostConstruct
   public init(){
     b2.someMethod();
   }


}
Run Code Online (Sandbox Code Playgroud)

小智 6

注入仅在实例化bean之后发生,这在调用构造函数之后发生,这就是为什么在第一种情况下你有NPE.

在第二种情况下,你自己实例化bean b2,这意味着它不会被Java EE服务器管理(这意味着没有注入)所以ref.b3将为null.

在第三种情况下,当调用init方法时,已调用所有构造函数并且已注入bean.