[英]When CDI injection into POJO should work? (GlassFish v3)
當我將EJB 3.1 bean注入由@Inject創建的POJO時,注入工作。 當我自己構建POJO時,它不會(Glassfish v3)。 這是正確的行為嗎?
我的類(在EJB模塊中):
@Singleton
@LocalBean
@Startup
@Named
public class NewSingletonBean {
@PostConstruct
public void init(){
System.out.println("NewSingletonBean INIT");
}
}
_
public class MyPOJO {
@Inject NewSingletonBean newSingletonBean;
public void sth(){
System.out.println("EJB injected into POJO: " + (newSingletonBean != null));
}
}
這不起作用 :
@Singleton
@LocalBean
@Startup
@DependsOn(value="NewSingletonBean")
public class NewSingletonBean2 {
@Inject NewSingletonBean newSingletonBean;
@PostConstruct
public void init(){
System.out.println("NewSingletonBean2 INIT");
System.out.println("EJB injected into EJB: " + (newSingletonBean != null));
MyPOJO p = new MyPOJO();
p.sth();
}
}
_
這個工作正常 :
@Singleton
@LocalBean
@Startup
@DependsOn(value="NewSingletonBean")
public class NewSingletonBean2 {
@Inject NewSingletonBean newSingletonBean;
@Inject MyPOJO p;
@PostConstruct
public void init(){
System.out.println("NewSingletonBean2 INIT");
System.out.println("EJB injected into EJB: " + (newSingletonBean != null));
p.sth();
}
}
我正在使用NetBeans 7.0.1。
dist目錄結構:
│ CDITest.ear
│
└───gfdeploy
└───CDITest
├───CDITest-ejb_jar
│ │ .netbeans_automatic_build
│ │ .netbeans_update_resources
│ │
│ ├───META-INF
│ │ beans.xml
│ │ MANIFEST.MF
│ │
│ └───tries
│ MyPOJO.class
│ NewSingletonBean.class
│ NewSingletonBean2.class
│
├───CDITest-war_war
│ │ index.jsp
│ │
│ ├───META-INF
│ │ MANIFEST.MF
│ │
│ └───WEB-INF
│ └───classes
│ .netbeans_automatic_build
│ .netbeans_update_resources
│
└───META-INF
MANIFEST.MF
未包裝的EAR結構:
│ CDITest-ejb.jar
│ CDITest-war.war
│
└───META-INF
MANIFEST.MF
解壓縮的EJB模塊jar結構:
├───META-INF
│ beans.xml
│ MANIFEST.MF
│
└───tries
MyPOJO.class
NewSingletonBean.class
NewSingletonBean2.class
這是正確的行為嗎?
以下部分可能是您問題的答案:
根據CDI 1.0規范 :
3.7。 Bean構造函數
當容器實例化bean類時,它會調用bean構造函數 。 bean構造函數是bean類的構造函數。
應用程序可以直接調用bean構造函數。 但是, 如果應用程序直接實例化bean ,則容器不會將任何參數傳遞給構造函數; 返回的對象不綁定任何上下文; 容器沒有注入依賴關系 ; 並且容器不管理新實例的生命周期。
HTH!
這是正確的行為,因為DI只適用於容器管理的bean,而不適用於那些,你自己創建的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.