当我将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
这是正确的行为吗?
答案 0 :(得分:11)
以下部分可能是您问题的答案:
<强> 3.7。 Bean构造函数
当容器实例化bean类时,它会调用 bean 构造。 bean构造函数是bean类的构造函数。
应用程序可以直接调用bean构造函数。但是,如果 应用程序直接实例化bean ,不传递任何参数 由容器到构造函数;返回的对象未绑定 任何背景; 容器没有依赖注入;和 新实例的生命周期不受容器管理。
HTH!
答案 1 :(得分:4)
这是正确的行为,因为DI仅适用于容器管理的bean,而不适用于那些,你自己创建的。