10

我们正在启动一个基于 EJB 3.0 的新项目。我有一个基于“spring”的背景(并且喜欢它),所以对我来说,松散耦合和可测试性是必不可少的。这篇文章不应该是关于“ejb vs. spring”的。如果您已经有这方面的实际项目经验,那将是完美的。

这是一些示例代码来演示该问题:

客户端 -> ejb -> 合作者 1 -> 合作者 .. -> 合作者 n

<!-- language: java -->
@Stateless
public class SampleService {

    // or @Inject via CDI
    // or @Autowired via Spring
    @EJB // or just use a stateless session bean via EJB 3.0
    private Bank bank;

    // same for this component
    @EJB
    private Calculator calc;

    // both collaborators must be settable from outside, to make everything testable (and mockable)

    /**
     * sample "business service" called from client
     */
    public void debit(BigDecimal amount){
        calc.calculate(amount.subtract(new BigDecimal(100)));
        bank.debit(amount);
    }

}

// or via @Component (Spring), or CDI?
@Stateless // or Stateless Session bean with optional @Service/@Singleton annotation?
public class Calculator {
    public void calculate(BigDecimal subtract) {
        // calculate stuff....
    }
}

// or via @Component (Spring), or CDI?
@Stateless // or Stateless Session bean with optional @Service/@Singleton annotation?
public class Bank {
    public void debit(BigDecimal amount) {
        // ...
    }
}

我想知道在 ejb 3.0 中为所有协作者及其协作者实现依赖注入的最佳方法是什么?从这个意义上讲,合作者可以是非常小的专门班级。

到目前为止,我们已经讨论了以下选项,并且总是没有正确的结论:)

  1. 仅将 ejb 标准与无状态会话 bean 的所有内容和所有后果(如池、资源处理等)一起使用

  2. 使用无状态会话 bean 作为“业务组件”(入口点)并从那里开始

a) spring 有线依赖(通过“jboss snowdrop”集成)

b) CDI 有线依赖(通过 WELD 用于 ejb 3.0 和 jboss eap 5.1)

我不需要知道如何在单元测试中使用 bean。我所追求的答案是连接正在运行的应用程序服务器内的所有依赖项的最佳方法是什么(spring vs. guice vs. CDI vs. EJB)。我只需要知道从外部 EJB(“业务入口点”)向下的图表。所以外面的一切(servlet、前端等)都不是这个问题的范围:)

请假设为项目设置了 EJB 3.0 和 jboss eap 5.1 :)

期待您的回答,并希望获得一些基于项目的知识。

4

4 回答 4

4

如果您需要方法级别的事务管理、安全性、并发管理或会话 bean 可以提供的任何其他服务,则将它们设为 EJB 会话 bean。您可以从托管 bean 开始,然后在需要时制作会话 bean。

如果要将这些会话 bean 注入托管 bean(在 CDI 中是 jar 文件中的任何内容,该文件包含 meta-inf 目录中的 beans.xml 文件),请使用 @EJB。如果要将普通托管 bean 注入会话 bean,请使用 @Inject。

如果您想注入远程会话 bean(或任何 Java EE 远程资源),则此链接说明了如何通过适配器类执行此操作。本质上,它将用于查找等的所有讨厌的字符串保存在一个地方,然后允许您像对待任何其他可注入 bean 一样处理这些远程资源(通过适配器成员变量上的 @Produces 注释)。您不必这样做,但建议这样做。

类型安全的资源注入

于 2011-04-07T23:17:58.920 回答
3

我肯定会投票反对混合框架。

我正在开发一个与 EJB、Spring 和 JBoss Seam 挂钩的项目(并且还有半 Flex、半 JSF 前端)。真正的科技动物园!
无论如何,将它们连接在一起并不是最糟糕的部分,这些框架具有灵活的注入功能。测试也或多或少可以忍受。
最痛苦的是摆脱不同生命周期模型引起的内存泄漏,同步事务,清理线程行为。

现在我们正在转向纯 Java EE 6(摆脱 Spring、Flex 并从 Seam 转向 CDI)。到目前为止,我们对结果非常满意。顺便说一句,我不是在批评 Spring。坚持使用 Java EE 或 Spring 堆栈,混合它们只是自找麻烦。

于 2014-02-14T12:26:39.527 回答
2

总的来说,Java 有“太多的选择”,所以在这个领域当然也是如此。我不会将 EJB 描述为通用的依赖注入框架,而是将 DI 用于其目的。如果这就是您想要编码的方式,您应该为此目的添加一个框架。如果你知道并喜欢 Spring,那就去吧。如果您需要另一个框架来弄清楚如何做到这一点,我已经将 Guice 与 EJB(这是一本不错的食谱)一起使用,效果也很好。

于 2011-03-14T18:01:01.953 回答
0

如果您的主要目标是允许依赖注入进行测试,我建议通过将这些值更改为受保护或给它们设置器来设置这些值。我喜欢使用 Mockito 对 Java EE EJB 3.0 中的所有内容进行存根,并且在进行集成测试之外的任何测试时只允许 Mockito 为我存根方法,但是如果您正在寻找完全依赖注入,例如拥有的能力几个不同的 bean 基于同一个类,但是我会推荐不同的依赖项,正如 Yishai 所说,并在顶部使用 Spring。

于 2011-03-14T20:58:17.017 回答