【问题标题】:Inject an EJB in Spring在 Spring 中注入 EJB
【发布时间】:2025-12-12 10:45:02
【问题描述】:

我定义了一个 EJB(通过使用 Java EE API 7)如下:

@Stateless
@LocalBean
public class Foo {

    @Inject
    private Boo boo;

    public void doFoo(Collection<Object> c) {
        boo.doSomething(c);
    }

}

还有:

@Named
@RequestScope
public class Boo() {

    public void doSomething(Collection<Object> c){
        // Do something...
    }

}

是否可以在 Spring 中将Foo 类的实例作为 EJB 注入?如果是,怎么做?

【问题讨论】:

    标签: java spring jakarta-ee ejb-3.0


    【解决方案1】:

    您可以使用注入拦截器。

    对于 EJB 3 会话 Bean 和消息驱动 Bean,Spring 提供了一个 解决 Spring 2.5 的 @Autowired 的便捷拦截器 EJB 组件类中的注解: org.springframework.ejb.interceptor.SpringBeanAutowiringInterceptor。 可以通过@Interceptors 应用此拦截器 EJB 组件类中的注释,或通过 EJB 部署描述符中的拦截器绑定 XML 元素。

    代码示例:

    @Stateless
    @Interceptors(SpringBeanAutowiringInterceptor.class)
    public class Foo { 
    
        @Autowired
        private Boo boo;
    
    }
    

    更多信息,参考18.3.2. EJB 3 injection interceptor

    如果你需要从 spring 访问 EJB,你可以像下面的例子在你的 spring-context.xml 配置中定义 bean

    <jee:local-slsb id="myComponent" jndi-name="ejb/fooBean"
          business-interface="com.Foo"/>
    

    您可以在 18.2.2 部分了解更多信息。访问上述引用的本地 SLSB

    【讨论】:

    • 因此,我无法完全分离这两个框架(注入纯 EJB)。
    • 明确地说,我有一个“纯”Java EE 项目,它定义了一个 EJB(Foo 类);它被部署为 jar。由于某些原因,我想将此 EJB 连接到 Spring 应用程序中。
    • 刚刚更新了我关于如何从 spring 访问 ejb 的答案
    • 嗯,很抱歉打扰你,但是“jndi-name”的定义是什么?
    • 它是您的 EJB 的名称,因为您正在使用注解,它可能是完整的包名 + 类:com.package.Foo... 您也可以在您使用时检查 ejb 的名称启动应用程序,它会在控制台中列出名称
    【解决方案2】:

    我将您的问题理解为:您在使用 spring 将请求范围的 bean 注入另一个时遇到问题。 所以试试这个:

    <bean id="boo" class="Boo" scope="request">
      <aop:scoped-proxy/>
    </bean>
    
    <bean id="foo" class="Foo">
      <property name="boo" ref="Boo" />
    </bean>
    

    【讨论】: