当CDI注入POJO应该有效吗? (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,而不适用于那些,你自己创建的。