我应该将@Transactional 注释放在哪里:在接口定义或实现类中?

2023-04-05Java开发问题
8

本文介绍了我应该将@Transactional 注释放在哪里:在接口定义或实现类中?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

问题描述

代码中标题的问题:

@Transactional (readonly = true)
public interface FooService {
   void doSmth ();
}


public class FooServiceImpl implements FooService {
   ...
}

public interface FooService {
   void doSmth ();
}

@Transactional (readonly = true)
public class FooServiceImpl implements FooService {
   ...
}

推荐答案

来自 http://static.springsource.org/spring/docs/2.0.x/reference/transaction.html

Spring 团队的建议是您只使用 @Transactional 注释来注释具体类,而不是注释接口.您当然可以将 @Transactional接口(或接口方法)上的 注释,但这只会在您使用基于接口的代理时按预期工作.注释不被继承这一事实意味着,如果您使用基于类的代理,则基于类的代理基础设施将无法识别事务设置,并且对象不会被包装在事务代理中(这绝对是糟糕).所以请务必听取 Spring 团队的建议,只使用 @Transactional 注释来注释具体类(以及具体类的方法).

The Spring team's recommendation is that you only annotate concrete classes with the @Transactional annotation, as opposed to annotating interfaces. You certainly can place the @Transactional annotation on an interface (or an interface method), but this will only work as you would expect it to if you are using interface-based proxies. The fact that annotations are not inherited means that if you are using class-based proxies then the transaction settings will not be recognised by the class-based proxying infrastructure and the object will not be wrapped in a transactional proxy (which would be decidedly bad). So please do take the Spring team's advice and only annotate concrete classes (and the methods of concrete classes) with the @Transactional annotation.

注意:由于这种机制是基于代理的,只有通过代理传入的外部"方法调用才会被拦截.这意味着自调用",即目标内的方法对象调用目标对象的某些其他方法,即使调用的方法标有 @Transactional!

Note: Since this mechanism is based on proxies, only 'external' method calls coming in through the proxy will be intercepted. This means that 'self-invocation', i.e. a method within the target object calling some other method of the target object, won't lead to an actual transaction at runtime even if the invoked method is marked with @Transactional!

(在第一句中添加了重点,原文中的其他重点.)

(Emphasis added to the first sentence, other emphasis from the original.)

这篇关于我应该将@Transactional 注释放在哪里:在接口定义或实现类中?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

The End

相关推荐

如何使用 JAVA 向 COM PORT 发送数据?
How to send data to COM PORT using JAVA?(如何使用 JAVA 向 COM PORT 发送数据?)...
2024-08-25 Java开发问题
21

如何使报表页面方向更改为“rtl"?
How to make a report page direction to change to quot;rtlquot;?(如何使报表页面方向更改为“rtl?)...
2024-08-25 Java开发问题
19

在 Eclipse 项目中使用西里尔文 .properties 文件
Use cyrillic .properties file in eclipse project(在 Eclipse 项目中使用西里尔文 .properties 文件)...
2024-08-25 Java开发问题
18

有没有办法在 Java 中检测 RTL 语言?
Is there any way to detect an RTL language in Java?(有没有办法在 Java 中检测 RTL 语言?)...
2024-08-25 Java开发问题
11

如何在 Java 中从 DB 加载资源包消息?
How to load resource bundle messages from DB in Java?(如何在 Java 中从 DB 加载资源包消息?)...
2024-08-25 Java开发问题
13

如何更改 Java 中的默认语言环境设置以使其保持一致?
How do I change the default locale settings in Java to make them consistent?(如何更改 Java 中的默认语言环境设置以使其保持一致?)...
2024-08-25 Java开发问题
13