我正在使用JBoss 6.1,但它并不完全符合EJB 3.1标准。目前,我无法通过@EJB
将EJB注入到我的Struts action类(或任何非Java EE容器管理的类)中,但当EJB 3.1规范得到完全实现时,是否有可能实现这一点呢?
如果不能,那么由于性能原因,在可预见的未来内实现这个功能是否太不可行了呢?
我正在使用JBoss 6.1,但它并不完全符合EJB 3.1标准。目前,我无法通过@EJB
将EJB注入到我的Struts action类(或任何非Java EE容器管理的类)中,但当EJB 3.1规范得到完全实现时,是否有可能实现这一点呢?
如果不能,那么由于性能原因,在可预见的未来内实现这个功能是否太不可行了呢?
没有容器可以向非托管对象注入任何内容。
要能够注入对象,容器需要管理对象的生命周期,或者至少参与其生命周期的管理,以便在早期阶段获取对象以进行注入。如果创建并使用对象而从未将其暴露给容器(如我想象的 Struts action beans),则容器永远没有机会向其中注入任何内容。容器不是魔法 - 它无法检测到在 JVM 中创建的所有对象并对其进行操作。
Mikko 的回答列出了可注入的对象类型。除非 action beans 是其中之一,否则很遗憾,无法注入。
现在,说了这么多,隧道尽头有一线光明:可能可以编写一个Struts扩展来处理注入。@EJB和@Resource注入与特定的JNDI查找相对应;一个扩展可以反射地查找带注释的字段,然后执行相应的JNDI查找并注入结果。CDI注入更容易,因为它具有专门用于编写扩展的API。关于如何做到这一点的示例,请参见Stripes injection enricher,它为Stripes Web框架添加了对@EJB、@Resource和@Inject的支持。不需要完全实现规范。这在Java EE规范v6中有解释(EJB 3.1是Java EE 6的一部分子规范)。以下组件能够注入(规范,组件类):
在所提及的规范中更深入地解释,在第68-71页。