如何将Singleton EJB(容器资源)注入POJO(非Container资源)?

时间:2013-10-04 04:04:00

标签: jboss7.x cdi ejb-3.1

我想在我的POJO类中注入一个Singleton EJB。 使用新的EJB 3.1规范,是否可以将EJB注入POJO? 我知道在EJB 3.0中,@ EJB注释可用于注入EJB,但这对简单的POJO不起作用。 @javax.inject.Inject也不适合我。

还有一件事是,容器和非容器资源之间有什么区别? 我如何实现它,我正在使用JBoss AS 7.1.1。

2 个答案:

答案 0 :(得分:6)

EE是围绕组件类(EJB,servlet等)的思想设计的。 EE容器只能在控制对象的创建时执行注入,这不适用于POJO,因此不能在POJO对象上使用EE注入。

要使CDI正常工作,您需要将META-INF/beans.xml添加到存档中。即使这样,您也无法使用new创建POJO实例。你总是要让容器创建实例,所以要@Inject POJO,然后可以@Inject EJB,或者使用javax.enterprise.inject.spi.BeanManager

答案 1 :(得分:2)

@EJB不适用于您,因此您只有两个选项 - JNDI查找或使用CDI。像

这样的东西
@Inject
private MyEJB ejb;

应该适合你。同时检查beans.xml文件夹中是否有WEB-INF以激活CDI容器。

对于差异 - 它几乎相同(虽然建议使用@Inject)只有例外 - 您仍然必须使用@EJB来注入远程bean。

无法使用service = new ServiceClass();的原因是容器无法管理service对象 - 这意味着在创建此类后不会进行注入,因为容器不再存在控制这个对象。非常天真地说,如果你这样做

@Inject
ServiceClass service;

容器将创建新实例,然后执行注射并将其返回给您。