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

时间:2011-04-05 12:08:25

标签: java spring interface transactions

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

4 个答案:

答案 0 :(得分:43)

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

查看The Spring Docs -- "Tips"了解详情。

  

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

答案 1 :(得分:31)

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

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

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

我没有在我的系统上使用接口,因为到目前为止我还没有看到是否可以通过它实现任何东西。所以我对实现进行了注释,我相信Spring会让一切都正确。

我不认为所有类都必须有接口。我看到很多具有大量模式的架构,他们都喜欢接口。但是一个问题:如果你把Spring注释放到接口中,并且由于某种原因,你想要通过这个接口完成实现类的事务的另一种方法,你就不能这样做。或者我错了吗?

干杯。