【问题标题】:Facade, service interfaces and transaction proxies with SpringSpring 的外观、服务接口和事务代理
【发布时间】:2011-03-31 17:11:49
【问题描述】:

情况

用户很可能不会直接与各种服务对象(PO​​JO 或会话 Bean)交互,因为使用外观模式将不同的单个服务收集到一组中。

@Transactional 注释应用于单个服务的方法级别,而不是 Facade 的方法。

这遇到了一个实际问题——如果服务没有接口,Spring 不能为它们使用好的事务代理,导致各种复杂性。

问题

什么是理想的做法?

  • 为了好的代理而创建单一服务接口,
  • 或将 @Transactional 注释移动到 Facade 方法(因此内部使用服务也必须流经 Facade 以确保事务)。
  • 要不然?

您的现场经验是什么?我也愿意从更广泛的角度考虑。

【问题讨论】:

    标签: spring interface transactions proxy facade


    【解决方案1】:

    如果服务没有接口,Spring 仍然可以通过使用CGLIB proxies 对其应用事务方面,在大多数情况下它工作正常。当服务有一些接口,但事务方法不是这些接口的一部分时,就会出现真正的问题。

    但是,将@Transactional 应用于 Facade 方法可能是一种更简洁的解决方案,因为 Facade 接口定义了清晰的事务边界。如果您担心在这种情况下使用没有 Facade 的服务,您可以将 @Transactional 应用于服务以及 Facade 方法。在这些情况下,当您调用 Facade 方法时创建的事务是 propagated 到服务方法。

    【讨论】:

    • 谢谢。最后,没有门面就无法使用服务。在界面上提及@Transactional 缺失也会导致问题。
    【解决方案2】:

    设置事务边界的唯一标准应该是业务逻辑标准,而不是技术问题。如果服务方法应该是原子操作,那么在那里管理事务。如果你的门面可以组合 2 个或更多的服务调用,并且它们应该是“执行全部或不执行”,这意味着事务应该放在门面。正如 axtavt 所提到的,cglib 代理可用于代理没有接口的类。

    我也推荐 Mark Richards 的这个系列:http://www.ibm.com/developerworks/views/java/libraryview.jsp?search_by=transaction+strategies

    【讨论】:

      猜你喜欢
      • 2016-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-06
      • 1970-01-01
      • 2023-04-04
      • 2016-12-02
      相关资源
      最近更新 更多