Spring AOP与@Transactional注解的区别

3

我希望使用Spring的事务管理功能来实现事务。但我不确定哪个更好(AOP vs @Transactional)。这两个特性都能正常工作吗?在开发效率方面有什么区别吗?


(补充)这里的AOP是指“使用AspectJ而不明确使用@Transactional注释”


(补充)我想知道注释配置和基于XML的配置的区别


5
你的问题对我来说毫无意义。@Transactional 注解使用 Spring AOP 实现事务管理。你能否澄清一下你的问题? - LaurentG
这里的AOP指的是“在不显式使用@Transactional注解的情况下使用AspectJ”。 - firia2000
为什么您需要将AOP(面向切面编程)与注释@Transactional进行比较? - Lion
使用自己的方面而不是Spring提供的方面来完成完全相同的工作,有点像重复造轮子。 - soulcheck
1
我猜firia2000想知道事务管理哪种更好:注释配置还是基于XML的配置。我说得对吗? - LaurentG
显示剩余2条评论
1个回答

3
我自己也曾经想过这个问题。在Spring论坛上,我找到了一个很好的关于这个话题的讨论。
以下是我从上述链接中总结的观点:

AOP事务划分

优点:

  • Java代码不包含事务配置,而是将其包含在配置文件中
  • Java代码没有直接依赖于Spring库
  • 事务管理集中在一个地方
  • 可以将事务边界应用于您不能轻松修改的源代码

缺点:

  • AOP复杂性。仅从代码中无法清楚地知道事务边界在哪里,开发人员可能会无意中通过修改方法签名来破坏事务
  • 需要在两个位置(源代码和AOP配置)上进行操作才能应用事务边界

@Transactional Spring注释

优点:

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

缺点:

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

这个讨论让我想起了JPA注释与JPA XML配置。使用基于XML的JPA配置,实体更加“干净”,但分离是否值得努力呢?或者甚至,分离是否有害(通过@Entity注释打开一个Java源文件,立即知道该类是EJB非常好)?实际上,我觉得大多数开发人员选择使用JPA注释。虽然在这种情况下,不像@Transactional那样,jpa注释是一个标准,这可能有助于缓解一些担忧。

也就是说,在我们使用Spring的AOP配置来注释Struts2(webwork)拦截器以允许每个请求一个事务的项目中,这个方法运作良好。在这种情况下,我们并没有真正担心服务层或其他地方的事务边界——一切都已经参与到一个事务中,因为视图在拦截器关闭事务之前呈现,所以没有必要应用OpenSession/EntityManagerInView解决方案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接