【问题标题】:Spring @Transactional class vs method precedence rulesSpring @Transactional 类与方法优先级规则
【发布时间】:2013-05-17 04:19:24
【问题描述】:

春天说@Transactional

在评估方法的事务设置时,派生最多的位置优先。

这是否意味着方法上的注解完全覆盖了类中的注解,或者省略的属性(所以默认值)不算数?

例如

@Transactional(isolation=Isolation.SERIALIZABLE)
public class MyService {

    @Transactional(readOnly=true)
    public void method() {
       ...
    }
}

那么方法的隔离设置是什么?这是Isolation.DEFAULT,因为这是默认值,所以它隐式覆盖Isolation.SERIALIZABLE,还是Isolation.SERIALIZABLE,因为方法注释上没有明确指定?

【问题讨论】:

    标签: java spring transactions


    【解决方案1】:

    方法级别的注解完全覆盖了类型级别的注解。在这里,任何类型的层次结构都是不可能的。让我再解释一下。无法查明 用户 是否为特定属性指定了值,或者当您读取注释的属性时是否返回了 default 值。因此,Spring 或其他任何人都无法确定是否覆盖了特定属性,或者是否使用了默认值。因此,无法根据属性的存在与否来做出决定。因此,无论何时覆盖任何注释(即以更精细的粒度指定它),您都需要指定所有必需的属性。因此,在您的情况下,Isolation.DEFAULT 将是应用的isolation

    但是,顺便说一句,假设您有自己的自定义注释,该注释将空字符串指定为某些属性的默认值。在这种情况下,如果您的类级别注释为该属性指定了一个非空字符串,而您的方法级别注释没有指定任何值(因此使用默认值:空字符串),您可以 推断应该使用来自类级别注释的属性值。也就是说,不允许方法级别注释中的默认值覆盖类级别的 user-specified 值。在任何此类情况下,您必须确保默认值不代表有效的属性值。在 @Transactional 注释的情况下,Isolation.DEFAULT 确实代表一个有效值,并且它可能已由用户明确指定。

    【讨论】:

    • 很好的答案,尤其是关于自定义注释和默认值的第二段。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-21
    • 2015-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-29
    相关资源
    最近更新 更多