Jakarta ee EJB3.1:它允许将bean注入到不由容器管理的资源中吗?

Jakarta ee EJB3.1:它允许将bean注入到不由容器管理的资源中吗?,jakarta-ee,ejb-3.0,ejb-3.1,jboss6.x,Jakarta Ee,Ejb 3.0,Ejb 3.1,Jboss6.x,我使用的是JBoss6.1,但它并不完全符合EJB3.1。到目前为止,我无法通过@EJB将EJB注入我的Struts操作类(或任何非javaee容器管理类),但是当ejb3.1规范完全实现时,这是否可能呢 如果不是,在可预见的未来,由于性能原因,是否不可能实现此功能?预计在完全实施规范的情况下,不可能实现此功能。JavaEE规范v6(EJB3.1是JavaEE6的一部分的子规范)对此进行了解释。以下组件能够注入(规范、组件类): Servlet:Servlet、Servlet过滤器、事件侦听器

我使用的是JBoss6.1,但它并不完全符合EJB3.1。到目前为止,我无法通过
@EJB
将EJB注入我的Struts操作类(或任何非javaee容器管理类),但是当ejb3.1规范完全实现时,这是否可能呢


如果不是,在可预见的未来,由于性能原因,是否不可能实现此功能?

预计在完全实施规范的情况下,不可能实现此功能。JavaEE规范v6(EJB3.1是JavaEE6的一部分的子规范)对此进行了解释。以下组件能够注入(规范、组件类):

  • Servlet:Servlet、Servlet过滤器、事件侦听器
  • JSP:标记处理程序、标记库事件侦听器
  • JSF:作用域托管bean
  • JAX-WS:服务端点、处理程序
  • EJB:bean、拦截器
  • 托管bean:托管bean
  • CDI:CDI风格的托管bean、装饰器
  • JavaEE平台:主类(静态),登录回调处理程序

上述规范第68-71页对此进行了更深入的解释。

任何容器都无法将任何内容注入非托管对象

为了能够注入到对象中,容器需要管理对象的生命周期,或者至少参与其生命周期的管理,这样它就可以在注入的早期阶段获得对象。如果创建和使用一个对象时没有向容器公开(我想象Struts action Bean就是这样),那么容器就没有机会向其中注入任何东西。容器不是魔法——它不能仅仅检测JVM中创建的对象并对其进行处理

Mikko的答案有一个很好的列表,列出了可以注入的对象的种类。除非动作豆是其中之一,否则恐怕没有骰子

现在,说到这里,隧道的尽头有一道亮光:很可能为Struts编写一个处理注入的扩展@EJB和@Resource注入相当直接地对应于特定的JNDI查找;扩展可以反射地查找带注释的字段,然后执行相应的JNDI查找并注入结果。CDI注入更容易,因为它有一个专门针对编写扩展的API。关于实现所有这些的示例,请查看,它为web框架添加了对@EJB、@Resource和@Inject的支持