Spring @Transactional класс против правил приоритета метода

Весна говорит об этом @Transactional

Наиболее производное местоположение имеет приоритет при оценке параметров транзакции для метода.

Означает ли это, что аннотация метода полностью переопределяет аннотацию из класса, или пропущенные атрибуты (по умолчанию) не учитываются?

Например

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

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

Так что такое настройки изоляции метода? Это Isolation.DEFAULT потому что это по умолчанию, так что неявно переопределяет Isolation.SERIALIZABLE либо это Isolation.SERIALIZABLE потому что никто не был явно указан в аннотации метода?

1 ответ

Решение

Аннотация на уровне метода полностью переопределяет аннотацию на уровне типа. Любая иерархия здесь не совсем возможна. Позвольте мне объяснить немного больше. Нет способа узнать, было ли задано пользователем значение для определенного атрибута, или если default Значение возвращается, когда вы читаете атрибуты аннотации. Так, Springили кто-либо еще, не может определить, был ли определенный атрибут переопределен или используется значение по умолчанию. Таким образом, нет никакого способа принять решение, основанное на наличии или отсутствии атрибута. По этой причине, когда вы переопределяете любую аннотацию (то есть указываете ее с более высокой степенью детализации), вам необходимо указать все обязательные атрибуты. Итак, в вашем случае, Isolation.DEFAULT будет isolation применяется.

Тем не менее, предположим, что у вас есть собственная пользовательская аннотация, в которой в качестве значения по умолчанию для некоторого атрибута указывается пустая строка. В этом случае, если ваша аннотация уровня класса задает непустую строку для этого атрибута, а ваша аннотация уровня метода не указывает никакого значения (таким образом, используя значение по умолчанию: пустая строка), вы можете сделать вывод, что Атрибут-значение из аннотации уровня класса должен использоваться. Таким образом, нельзя допустить, чтобы значение по умолчанию в аннотации уровня метода переопределяло указанное пользователем значение на уровне класса. В любом таком сценарии вы должны быть уверены, что значение по умолчанию не представляет допустимое значение атрибута. В случае с @Transactional аннотации, Isolation.DEFAULT действительно представляет допустимое значение, и оно может быть явно указано пользователем.

Другие вопросы по тегам