弹簧@Transactional类与方法优先规则

2022-09-04 19:20:52

春天说阿布奥特@Transactional

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

这是否意味着方法上的注释完全覆盖了类中的注释,还是省略的属性(因此默认值)不计算在内?

例如:

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

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

那么该方法的隔离设置是什么呢?这是因为这是默认值,因此它隐式覆盖,还是因为在方法注释上没有显式指定任何内容?Isolation.DEFAULTIsolation.SERIALIZABLEIsolation.SERIALIZABLE


答案 1

方法级别的批注完全覆盖类型级的批注。任何一种等级制度在这里都是不可能的。让我再解释一下。无法确定用户是否为特定属性指定了值,或者在读取批注的属性时是否返回了值。因此,或其他任何人都无法确定特定属性是否已被覆盖,或者是否正在使用默认值。因此,没有办法根据属性的存在与否做出决定。因此,每当覆盖任何注释(即,以更精细的粒度指定它)时,都需要指定所有必需的属性。因此,在您的情况下,将应用。defaultSpringIsolation.DEFAULTisolation

但是,顺便说一句,假设您有自己的自定义批注,该批注将空字符串指定为某些属性的默认值。在这种情况下,如果类级批注为该特性指定了非空字符串,而方法级批注未指定任何值(因此使用默认值:空字符串),则可以推断应使用类级批注中的特性值。也就是说,不允许方法级批注中的默认值在类级别重写用户指定的值。在任何此类情况下,必须确保默认值不表示有效的属性值。对于注释,确实表示有效值,并且它可能已由用户显式指定。@TransactionalIsolation.DEFAULT


答案 2

推荐