3

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


(添加)这里 AOP 的意思是“使用 AspectJ 而不显式使用 @Transactional 注释”


(已添加)我想知道 annotation-config 和基于 XML 的配置的区别

4

1 回答 1

3

我自己也想过这个。我在Spring 论坛上找到了关于这个主题的一个很好的讨论。

下面我总结了我对上述链接的看法:

AOP 事务分界

好处:

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

缺点:

  • AOP 复杂性。仅从代码中并不清楚事务边界在哪里,开发人员可能会通过例如修改应用切入点的方法签名来无意中破坏事务
  • 需要触及两个位置(源代码和 AOP 配置)以应用事务边界

@Transactional弹簧注解

好处:

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

缺点:

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

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

也就是说,我参与的项目是我们使用 Spring 的 AOP 配置来注释 Struts2 (webwork) 拦截器以允许每个请求执行单个事务,并且效果很好。在这种情况下,我们并不真正担心服务层或其他地方的事务边界——一切都已经参与到事务中,并且由于在拦截器关闭事务之前呈现的视图,因此无需应用OpenSession/EntityManagerInView解决方案。

于 2013-09-23T20:11:28.237 回答