EJB 3.1:它是否允许将Bean注入到容器未管理的资源中?

4

我正在使用JBoss 6.1,但它并不完全符合EJB 3.1标准。目前,我无法通过@EJB将EJB注入到我的Struts action类(或任何非Java EE容器管理的类)中,但当EJB 3.1规范得到完全实现时,是否有可能实现这一点呢?

如果不能,那么由于性能原因,在可预见的未来内实现这个功能是否太不可行了呢?

2个回答

4

没有容器可以向非托管对象注入任何内容。

要能够注入对象,容器需要管理对象的生命周期,或者至少参与其生命周期的管理,以便在早期阶段获取对象以进行注入。如果创建并使用对象而从未将其暴露给容器(如我想象的 Struts action beans),则容器永远没有机会向其中注入任何内容。容器不是魔法 - 它无法检测到在 JVM 中创建的所有对象并对其进行操作。

Mikko 的回答列出了可注入的对象类型。除非 action beans 是其中之一,否则很遗憾,无法注入。

现在,说了这么多,隧道尽头有一线光明:可能可以编写一个Struts扩展来处理注入。@EJB和@Resource注入与特定的JNDI查找相对应;一个扩展可以反射地查找带注释的字段,然后执行相应的JNDI查找并注入结果。CDI注入更容易,因为它具有专门用于编写扩展的API。关于如何做到这一点的示例,请参见Stripes injection enricher,它为Stripes Web框架添加了对@EJB、@Resource和@Inject的支持。

3

不需要完全实现规范。这在Java EE规范v6中有解释(EJB 3.1是Java EE 6的一部分子规范)。以下组件能够注入(规范,组件类):

  • Servlet:servlet、servlet过滤器、事件监听器
  • JSP:标签处理程序、标签库事件监听器
  • JSF:作用域托管bean
  • JAX-WS:服务端点、处理程序
  • EJB:bean、拦截器
  • 托管bean:托管bean
  • CDI:CDI样式的托管bean、装饰器
  • Java EE平台:主类(静态)、登录回调处理程序

在所提及的规范中更深入地解释,在第68-71页。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接