6

Springドキュメンテーションは、インターフェイスではなく具象クラス/メソッドに@Transactionalアノテーションを置くことを推奨しています。この理由は、例えば、スタックオーバーフローの上に何度もカバーされています:Spring @Transactional v Springセキュリティ@Secured inconsistent behavior

Where should I put @Transactional annotation: at an interface definition or at an implementing class?

春のセキュリティ@Securedの動作が異なります。ほとんどのドキュメンテーションは、注釈をインタフェースに配置することを示しています。実際には、JDKまたはCGLibプロキシを使用するかどうかに関わらず、インターフェースや具体的なクラスに注釈を付けるかどうかにかかわらず動作するようです。

これは優れた解決策です。だからなぜ不一致?上記の質問に対する1つの答えは、パフォーマンスへの影響を示唆しています...しかし確かにパフォーマンスはセキュリティにとっても重要ですか?

@Securedソリューションはダイヤモンドの継承の問題をどのように扱いますか(クラスは2つのインターフェイスに@Secured同じメソッドを別々に実装しています)?

答えて

3

JDKプロキシとCGLibの両方を使用している場合、TransactionInterceptor@TransactionalMethodSecurityInterceptor@Securedとなります。

しかし、これらの2つのMethodInterceptorsは、特定のMethodInvocationで注釈を見つけるために異なるメカニズムを使用します。 @TransactionalがSpringTransactionAnnotationParserの助けを借りてAnnotationTransactionAttributeSourceによって発見されている間

@Secured注釈は、AnnotationUtils.findAnnotation(Method method, Class<A> annotationType)方法を使用してSecuredAnnotationSecurityMetadataSourceによって発見されました。

AnnotationUtilsには、アノテーションを見つけるためのより高度なメカニズムがあり、インターフェースとクラス階層を宣言するメソッドの両方を巡回するように見えます。

AnnotationUtilsを使用する独自のTransactionAnnotationParserを作成すると、@Transactionalと同じ機能が有効になります。

AnnotationUtilsは、最初に見つかった注釈を返します。したがって、ダイヤモンド継承の処理方法です。

関連する問題