13

春は言います@Transactional

メソッドのトランザクション設定を評価するときは、最も派生した場所が優先されます。

これは、メソッドの注釈がクラスの注釈を完全にオーバーライドすることを意味しますか、それとも省略された属性 (デフォルト) はカウントされませんか?

例えば

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

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

では、メソッドの分離設定は何ですか? これIsolation.DEFAULTはデフォルトであるため暗黙的にオーバーライドさIsolation.SERIALIZABLEれるIsolation.SERIALIZABLEためですか、それともメソッド注釈で明示的に指定されていないためですか?

4

1 に答える 1

21

メソッド レベルの注釈は、型レベルの注釈を完全にオーバーライドします。ここでは、どのような種類の階層もまったくあり得ません。もう少し説明しましょう。ユーザーが特定の属性に対して値を指定したかどうか、またはdefault注釈の属性を読み取るときに値が返されているかどうかを確認する方法はありません。そのためSpring、または他の誰でも、特定の属性がオーバーライドされたかどうか、またはデフォルト値が使用されているかどうかを判断できません。したがって、属性の有無に基づいて決定を下す方法はありません。そのため、アノテーションをオーバーライドする (つまり、より細かい粒度で指定する) 場合は常に、必要なすべての属性を指定する必要があります。したがって、あなたの場合、Isolation.DEFAULTisolation適用されます。

ただし、余談ですが、空の文字列を属性のデフォルト値として指定する独自のカスタム アノテーションがあるとします。その場合、クラス レベルの注釈がその属性に空でない文字列を指定し、メソッド レベルの注釈が値を指定しない場合 (したがって、既定値の空の文字列を使用)、次のように推測できます。クラスレベルの注釈の属性値を使用する必要があります。つまり、メソッド レベルの注釈のデフォルト値が、クラス レベルでユーザー指定の値をオーバーライドすることを許可しません。そのようなシナリオでは、デフォルト値が有効な属性値を表していないことを確認する必要があります。@Transactional注釈の場合、Isolation.DEFAULTは有効な値を表し、ユーザーによって明示的に指定されている可能性があります。

于 2013-05-22T10:06:38.170 に答える