在哪里放置@Transactional?在接口规范或实现中? [复制]

Posted

技术标签:

【中文标题】在哪里放置@Transactional?在接口规范或实现中? [复制]【英文标题】:Where to put @Transactional? In interface specification or implementation? [duplicate] 【发布时间】:2011-07-29 22:07:47 【问题描述】:

放置@Transactional 注释的最佳做法是什么?我应该注释接口方法还是实现?

【问题讨论】:

【参考方案1】:

在我看来,这完全取决于您的应用程序架构。这取决于您如何代理您的课程。如果您的应用程序设置为proxy-target-class='true'(在您的应用程序上下文中,如果您对接口进行注释,则不会获取您的@Transactional 信息。

查看The Spring Docs -- "Tips"了解更多信息。

Spring 建议您仅使用 @Transactional 注释来注释具体类(和具体类的方法),而不是注释接口。您当然可以将 @Transactional 注释放在接口(或接口方法)上,但这仅在您使用基于接口的代理时才起作用。 Java 注释不是从接口继承的事实意味着,如果您使用基于类的代理 (proxy-target-class="true") 或基于编织的方面 (mode="aspectj"),则事务设置为不被代理和编织基础设施识别,并且对象不会被包装在事务代理中,这绝对是糟糕的。

【讨论】:

小费+1。我正在编辑您的答案以添加报价 有没有办法拥有public class MyImplementation implements NonTransactionalInterface, TransactionalInterface /* ... */ ,然后只自动连接未标记@Transactional (@Autowiring NonTransactionalInterface serviceImplementationWithoutUsingTransactions) 的接口? (当然,在该示例中,MyImplementationNonTransactionalInterface 都缺少 @Transactional,而只有 TransactionalInterface 被该注释标记。)【参考方案2】:

我不在我的系统上使用接口,因为到目前为止我还没有真正看到是否有可能在它上面实现任何东西。所以我在实现上加了注解,我相信 Spring 会让一切对我来说都是正确的。

我不认为所有的类都必须有接口。我看到很多架构有很多模式,他们都喜欢接口。但是有一个问题:如果您将 Spring 注释放入接口中,并且出于某种原因,您希望通过此接口完成实现类事务的另一种方法,您就无法做到这一点。还是我错了?

干杯。

【讨论】:

【参考方案3】:

虽然事务管理在许多情况下是实现细节,但它通常也是一个接口细节。例如,在定义应用程序的服务接口时,您可能会考虑将@Transactional 放入接口定义中,以明确说明您正在使用的传播策略。

【讨论】:

【参考方案4】:

好问题。我一直把它放在实现中。也许是因为它是一个实现细节,而不是一个抽象。

您可能希望不同的实现具有不同的事务行为。

El Guapo 指出,除此之外,在界面上可能会出现更多与代理策略相关的问题。

【讨论】:

提出了另一个非常好的观点。不错的评论! 有人知道 JTA 规范中关于注释的内容吗?提供者必须检查注解的超类型的方法签名吗?更重要的是,如果使用非注释版本覆盖带注释的方法,注释处理器/反射是如何感知的?

以上是关于在哪里放置@Transactional?在接口规范或实现中? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

我必须在哪里使用注释@Service @Transactional

在哪里使用@Transactional注解和@Repository注解

即使 @Transactional 放置在服务层中,Spring boot JPA 存储库也会提交代码

DDD:在哪里放置域服务的实现

@Transactional注解详细解读

@Transactional注解的使用范围