EJB3:为什么事务语义和有状态都考虑了实现细节?

时间:2010-01-25 12:31:52

标签: java ejb-3.0 bean-managed-transactions

事务语义和状态完整性被认为是EJB3中的实现细节。 实现可以决定是使用bean还是容器管理的事务。 它可以决定容器管理事务的类型。 它可以决定它是满州还是无国籍。

然而,从逻辑上讲,这些都是重要的界面细节。 示例:(a)使用bean托管事务的bean无法使用容器管理事务调用bean。 (b)无状态bean无法调用满状态的bean。

当提供EJB3接口时,您不知道它需要什么样的事务语义。同样,你不知道它是满州还是无国籍。 您需要额外的实施细节。示例:文档。

在运行时,可以动态地实例化不同的bean和调用链。因此可能出现无效状态。现在 - 容器可以捕获这些情况;但为什么要等到运行时?

为什么事务语义和状态丰满度要求不属于接口?

1 个答案:

答案 0 :(得分:1)

  

交易语义和   考虑到国家充实   EJB3中的实现细节。一个   实现可以决定是否   使用bean或容器管理   交易。它可以决定类型   容器管理事务。   它可以决定它是否满州   或无国籍。

我理解管理这一点,从客户的角度来看确实很重要。

关于交易,这有点棘手。

  • 事务的类型bean-managedcontainer-managed实施细节(我不确定您的示例(a)) 。
  • 传播语义。 (requiredmandatorynone等。)。
  

现在 - 容器可以捕获这些   的情况;但为什么要等到   运行

即使接口上存在所有内容,类型系统仍然不足以在编译类型中强制执行规则。

您无论如何都需要一个工具来根据适用语义来检查这些约束。 IDE可以解析注释,容器可以在部署模块时执行,更糟糕的是它在运行时失败。

  

为什么是事务语义和   国家充实要求不是一部分   接口?

java 接口仅包含有关组件正确用法的有限信息集,无论是类,bean还是API。大多数组件的总体契约比界面中公开的更复杂。

示例:

  • 线程安全:如何在不查看文档的情况下知道特定类是否是线程安全的?
  • ContentHandler.characters():你怎么知道每个XML标签可以多次调用它?
  • 这个名单继续......

我个人使用术语合同来引用完整的约束集。 接口仅从类型系统的角度给出了方法的签名。

如果您对该主题感兴趣,我建议您查看design by contract。很长一段时间以来,将组件之间的契约正式化的想法已经存在。

所以我的答案是:因为即使它是,你仍然需要更多的信息。