Spring @transaction是否适用于抽象类的具体方法

时间:2014-05-19 11:10:08

标签: spring transactions spring-transactions

来自春季参考文档

  

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(),它将是事务性的吗?

1 个答案:

答案 0 :(得分:13)

授予您实际正确配置Spring事务管理的权限,在抽象超类上使用@Transactional工作,因为@Transactional本身已使用@Inherited进行注释,来自它Javadoc我们有:

  

表示自动继承注释类型。如果   继承的元注释存在于注释类型上   声明,用户查询类的注释类型   声明,类声明没有注释   类型,然后将自动查询类的超类   注释类型。将重复此过程直到注释   找到此类型,或者类层次结构(Object)的顶部是   到达。如果没有超类具有此类型的注释,那么   查询将指示有问题的类没有这样的注释。

     

请注意,如果带注释,则此元注释类型无效   type用于注释除类之外的任何内容。另请注意   这个元注释只会导致注释继承自   超;已实现的接口上的注释无效。

要实际看到@Transactional已注明@Inherited,请查看Javadoc