Spring AOP vs @Transactional注释

时间:2013-08-30 08:59:09

标签: spring spring-transactions

我想使用Spring的事务管理功能实现事务。但我不确定哪个更好(AOP vs @Transactional)。这两个功能是否正常工作?发展效率有什么不同吗?


(新增) 这里AOP的意思是“在不使用@Transactional注释的情况下使用AspectJ”


(新增)  我想知道annotation-config和基于XML的配置的区别

1 个答案:

答案 0 :(得分:3)

我自己也想知道这件事。我在Spring forum上找到了关于这个主题的很好的讨论。

下面我总结一下上述链接中的内容:

AOP交易分界

优点:

  • Java代码没有事务配置,而是包含在配置文件
  • 中的代码之外
  • Java代码与Spring库没有直接的依赖关系
  • 交易管理集中在一个地方
  • 可以将事务边界应用于您无法轻易修改的源代码

缺点:

  • AOP复杂性。从单独的代码中可以看出,事务边界所在并且开发人员可能会无意中破坏事务,例如,修改应用切入点的方法签名
  • 需要触摸两个位置(源代码和AOP配置)才能应用事务边界

@Transactional Spring注释

优点:

  • 检查源代码时,可以更清楚地理解事务边界

缺点:

  • Java代码与事务声明相结合(尽管只在元数据级别,但仍需要Spring导入)。

讨论让我想起了JPA注释与JPA XML配置。使用基于XML的JPA配置,实体“更清洁”,但分离值得努力吗?或者甚至可能是分离有害(能够打开java源文件并立即根据@Entity注释知道该类是EJB)很好吗?实际上,在我看来,大多数开发人员都选择使用JPA注释。虽然在这种情况下不像@Transactional,但jpa注释是标准,因此可能有助于缓解一些问题。

那就是说,我参与了项目,因为我们使用Spring的AOP配置来注释一个Struts2(webwork)拦截器,允许每个请求进行一次事务处理,这很好。在这种情况下,我们并没有真正担心服务层或其他地方的事务边界 - 一切都已经参与了事务,并且由于在拦截器关闭事务之前呈现的视图,因此不需要应用{{1解决方案。