Spring 说abuot @Transactional


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

例如。

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

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

那么该方法的隔离设置是什么?这是Isolation.DEFAULT,因为这是默认设置,所以它隐式地覆盖了Isolation.SERIALIZABLE,还是Isolation.SERIALIZABLE,因为在方法注释中未明确指定任何内容?

最佳答案

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

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

07-28 04:17
查看更多