Spring的Facade,服务接口和事务代理

时间:2011-03-31 17:11:49

标签: spring interface transactions proxy facade

场合

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

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

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

问题

什么是理想的做法?

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

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

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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

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