我们正在启动一个基于 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 中为所有协作者及其协作者实现依赖注入的最佳方法是什么?从这个意义上讲,合作者可以是非常小的专门班级。
到目前为止,我们已经讨论了以下选项,并且总是没有正确的结论:)
仅将 ejb 标准与无状态会话 bean 的所有内容和所有后果(如池、资源处理等)一起使用
使用无状态会话 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 :)
期待您的回答,并希望获得一些基于项目的知识。