放在哪里@Transactional?在接口规范或实现中?

2022-08-31 16:42:07

放置批注的最佳做法是什么?我应该对接口方法或实现进行注释吗?@Transactional


答案 1

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

查看春季文档 - “提示”以获取更多信息。

Spring 建议您仅使用@Transactional注释来批注具体类(以及具体类的方法),而不是对接口进行批注。您当然可以将@Transactional注释放在接口(或接口方法)上,但这只有在使用基于接口的代理时才能正常工作。Java注释不是从接口继承的事实意味着,如果您使用的是基于类的代理(proxy-target-class=“true”)或基于编织的方面(mode=“aspectj”),那么代理和编织基础结构无法识别事务设置,并且对象不会包装在事务代理中,这绝对是糟糕的。


答案 2

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

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

El Guapo指出,除此之外,在接口上放置可能会产生更多与代理策略相关的问题。