我应该把@Transactional 注释放在哪里:在接口定义还是在实现类? [英] Where should I put @Transactional annotation: at an interface definition or at an implementing class?
问题描述
代码中标题的问题:
@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 注释放在哪里:在接口定义还是在实现类?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!