当CDI注入POJO应该有效吗? (GlassFish v3)

时间:2011-11-17 11:01:02

标签: java glassfish ejb cdi ejb-3.1

当我将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

Unpacked 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

这是正确的行为吗?

2 个答案:

答案 0 :(得分:11)

以下部分可能是您问题的答案:

根据CDI 1.0 specification

<强> 3.7。 Bean构造函数

  

当容器实例化bean类时,它会调用 bean   构造。 bean构造函数是bean类的构造函数。

     

应用程序可以直接调用bean构造函数。但是,如果   应用程序直接实例化bean ,不传递任何参数   由容器到构造函数;返回的对象未绑定   任何背景; 容器没有依赖注入;和   新实例的生命周期不受容器管理。

HTH!

答案 1 :(得分:4)

这是正确的行为,因为DI仅适用于容器管理的bean,而不适用于那些,你自己创建的。