簡體   English   中英

當CDI注入POJO應該有效嗎? (GlassFish v3)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM