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

nay*_*yef 13 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
}
Run Code Online (Sandbox Code Playgroud)

以及扩展该类的具体类

public class SpecialService extends BaseService{
//body of class
}
Run Code Online (Sandbox Code Playgroud)

现在,如果我specialService.updateData()从我的控制器类调用它将是事务性的吗?

geo*_*and 14

授予你实际上已经正确配置Spring的事务管理,使用@Transactional上的抽象超工作,因为@Transactional本身带有加注解@Inherited,并从它的Javadoc中,我们有:

表示自动继承注释类型.如果注释类型声明中存在Inherited元注释,并且用户在类声明上查询注释类型,并且类声明没有此类型的注释,则将自动查询类的超类以获取注释类型.将重复此过程,直到找到此类型的注释,或者到达类层次结构(对象)的顶部.如果没有超类具有此类型的注释,则查询将指示相关类没有此类注释.

请注意,如果使用带注释的类型来注释除类之外的任何内容,则此元注释类型不起作用.另请注意,此元注释仅导致注释从超类继承; 已实现接口上的注释无效.

要实际看到它@Transactional的注释,@Inherited请查看它的Javadoc