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

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

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

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

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

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

查看Spring文档 – “提示”了解更多信息。

Springbuild议您只使用@Transactional注释来注释具体类(以及具体类的方法),而不是注释接口。 您当然可以将@Transactional注释放在一个接口(或一个接口方法)上,但是这只能在您使用基于接口的代理的情况下使用。 Java注释没有从接口inheritance的事实意味着,如果您使用的是基于类的代理(proxy-target-class =“true”)或基于交织的方面(mode =“aspectj”),那么交易设置是没有被代理和编织基础架构认可,并且该对象不会被封装在一个事务代理中,这将是非常糟糕的。

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

我不使用我的系统上的接口,因为到目前为止,我真的不知道是否有可能实现它的任何东西。 所以我把注释放在实现上,我相信Spring会使我的一切变得正确。

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

干杯。