依赖注入EJB 3 - 选择太多了?

Mar*_*cel 10 java spring dependency-injection ejb cdi

我们正在开始一个基于EJB 3.0的新项目.我有一个"春天"的背景(并喜欢它),所以对我来说,松耦合和可测试性是必须具备的.这篇文章不应该是关于"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) {
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

我想知道在ejb 3.0中为所有协作者及其协作者实现依赖注入的最佳方法是什么?这种意义上的合作者可以是非常小的专用课程.

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

  1. 只使用ejb标准,包括无状态会话bean以及所有后果(如汇集,资源处理等)

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

a)弹簧有线依赖(通过"jboss snowdrop"集成)

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

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

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

期待您的答案,并希望一些基于项目的知识.

Yis*_*hai 2

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