6

La documentazione Spring consiglia di inserire l'annotazione @Transactional sulla classe/metodo concreto anziché sull'interfaccia. La ragione di questo è stato coperto su Stack Overflow molte volte, ad esempio:Spring @Transactional v Spring Security @ Comportamento incoerente protetto

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

Primavera di sicurezza comportamento @Secured diverso; la maggior parte della documentazione mostra l'inserimento dell'annotazione nell'interfaccia. In effetti sembra funzionare se annoti l'interfaccia o la classe concreta e indipendentemente dal fatto che tu usi i proxy JDK o CGLib.

Questa sembra una soluzione superiore. Allora, perché l'incoerenza? Una risposta alla domanda di cui sopra suggerisce un impatto sulle prestazioni ... ma sicuramente le prestazioni sono altrettanto importanti per la sicurezza ?!

E come fa l'affare soluzione @Secured il problema diamante eredità (classe implementa 2 interfacce entrambi hanno @Secured stesso metodo in modo diverso)?

risposta

3

Quando si utilizzano entrambi i proxy JDK e CGLIB si finisce con TransactionInterceptor per @Transactional e MethodSecurityInterceptor per @Secured.

Ma questi due MethodInterceptors utilizzano meccanismi diversi per trovare annotazioni su MethodInvocation.

annotazione @Secured è trovato da SecuredAnnotationSecurityMetadataSource utilizzando AnnotationUtils.findAnnotation(Method method, Class<A> annotationType) metodo, mentre @Transactional viene scoperto da AnnotationTransactionAttributeSource con l'aiuto di SpringTransactionAnnotationParser.

Sembra AnnotationUtils hanno meccanismi molto più avanzate di trovare annotazioni, seraching entrambe le interfacce e la gerarchia delle classi metodo di dichiarazione.

È possibile creare il proprio TransactionAnnotationParser che utilizza AnnotationUtils e questo dovrebbe abilitare lo stesso functioanlity a @Transactional.

AnnotationUtils restituisce il primo trovato annotazioni, così che è come l'ereditarietà diamante viene affrontato.