6

La documentation Spring conseille de placer l'annotation @Transactional sur la classe/méthode concrète plutôt que sur l'interface. La raison de ce qui a été couvert de débordement de pile à plusieurs reprises, par exemple:Spring @Transactional v Spring Security @Secured comportement incohérent

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

comportement @Secured Spring Security diffère; la plupart des documents montrent placer l'annotation sur l'interface. En fait, cela semble fonctionner que vous annotiez l'interface ou la classe concrète et que vous utilisiez des proxys JDK ou CGLib.

Cela semble une solution supérieure. Alors pourquoi l'incohérence? Une réponse à la question ci-dessus suggère un impact sur les performances ... mais la performance est tout aussi importante pour la sécurité ?!

Et comment la solution @Secured gère-t-elle le problème de l'héritage du diamant (la classe implémente 2 interfaces ont la même méthode @Secured)?

Répondre

3

Lorsque vous utilisez les deux procurations JDK et Cglib Vous vous retrouvez avec TransactionInterceptor pour @Transactional et MethodSecurityInterceptor pour @Secured.

Mais ces deux MethodInterceptors utilisent différents mécanismes pour trouver l'annotation sur MethodInvocation donné.

annotation @Secured se trouve par SecuredAnnotationSecurityMetadataSource en utilisant la méthode AnnotationUtils.findAnnotation(Method method, Class<A> annotationType), tandis que @Transactional est découverte par AnnotationTransactionAttributeSource avec l'aide de SpringTransactionAnnotationParser.

Il semble que AnnotationUtils dispose de mécanismes beaucoup plus avancés pour trouver des annotations, en rapprochant à la fois les interfaces et la méthode déclarant la hiérarchie des classes.

Vous pouvez créer votre propre TransactionAnnotationParser qui utilise AnnotationUtils et ceci devrait permettre la même fonctionnalité à @Transactional.

AnnotationUtils renvoie la première annotation trouvée, de sorte que l'héritage du diamant est traité.