【问题标题】:Does Spring @transaction work on a concrete method of abstract classSpring @transaction 是否适用于抽象类的具体方法
【发布时间】:2014-05-19 19:35:49
【问题描述】:

来自弹簧参考文档

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

【问题讨论】:

  • 尝试时会发生什么?
  • 当我在抽象类上尝试 @Transactional 时。 Spring 报告了一个不同的错误:一个组件需要一个无法找到的“mypackage.ActivityService”类型的 bean。只要我从抽象类中取消注释 Transactional 注释,就可以了。

标签: spring transactions spring-transactions


【解决方案1】:

假设您实际上已经正确配置了 Spring 事务管理,在抽象超类上使用 @Transactional 起作用,因为 @Transactional 本身是用 @Inherited 注释的,我们从它的 Javadoc有:

表示一个注解类型是自动继承的。如果 注释类型上存在继承的元注释 声明,用户查询类上的注解类型 声明,并且类声明对此没有注释 类型,则将自动查询该类的超类 注释类型。这个过程会一直重复,直到有注解 找到此类型,或者类层次结构(对象)的顶部是 到达。如果没有超类有这个类型的注解,那么 查询将表明有问题的类没有这样的注释。

请注意,如果已注释,则此元注释类型无效 type 用于注释除类以外的任何内容。另请注意 此元注释仅导致注释从 超类;已实现接口上的注释无效。

要真正看到@Transactional@Inherited 注释,请查看Javadoc

【讨论】:

    猜你喜欢
    • 2012-12-02
    • 1970-01-01
    • 1970-01-01
    • 2013-05-16
    • 2018-05-12
    • 2016-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多