来自春季参考文档
Spring建议您只使用@Transactional注释来注释具体类(以及具体类的方法),而不是注释接口。您当然可以将@Transactional注释放在接口(或接口方法)上,但这只能在您使用基于接口的代理时按预期工作。 Java的事实 注释不是从接口继承意味着如果您使用基于类的代理(proxy-target-class =“true”)或基于编织的方面(mode =“aspectj”),则交易设置不会被代理和编织基础设施,并且该对象不会被包装在事务代理中,这将是非常糟糕的。
虽然它只涉及接口,但抽象类也被认为是非具体的。
所以,如果我有一个抽象类
public abstract class BaseService{
//here is a concrete method
@Transactional
public void updateData{
//do stuff using dao layer
}
和扩展类
的具体类public class SpecialService extends BaseService{
//body of class
}
现在,如果我从我的控制器类中调用specialService.updateData()
,它将是事务性的吗?
答案 0 :(得分:13)
授予您实际正确配置Spring事务管理的权限,在抽象超类上使用@Transactional
将工作,因为@Transactional
本身已使用@Inherited
进行注释,来自它Javadoc我们有:
表示自动继承注释类型。如果 继承的元注释存在于注释类型上 声明,用户查询类的注释类型 声明,类声明没有注释 类型,然后将自动查询类的超类 注释类型。将重复此过程直到注释 找到此类型,或者类层次结构(Object)的顶部是 到达。如果没有超类具有此类型的注释,那么 查询将指示有问题的类没有这样的注释。
请注意,如果带注释,则此元注释类型无效 type用于注释除类之外的任何内容。另请注意 这个元注释只会导致注释继承自 超;已实现的接口上的注释无效。
要实际看到@Transactional
已注明@Inherited
,请查看Javadoc