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

Joh*_*nak 51 java spring transactions interface

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

El *_*apo 44

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

查看The Spring Docs - "提示"了解更多信息.

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

  • +1为小费。我正在编辑您的答案以添加报价 (2认同)

Boz*_*zho 33

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

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

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

  • 任何人都知道 JTA 规范对注释有什么看法?提供者是否必须检查超类型的方法签名以获取注释?更重要的是,如果用非注释版本覆盖带注释的方法,注释处理器/反射如何感知? (2认同)