Spring @Transactional v Spring Security @Secured противоречивое поведение

Документация Spring рекомендует помещать аннотацию @Transactional в конкретный класс/метод, а не в интерфейс. Причина этого много раз освещалась в Stack Overflow, например:

Где я должен поместить @Transactional аннотация: в определении интерфейса или в реализующем классе?

Поведение Spring Security @Secured отличается; большая часть документации показывает размещение аннотации на интерфейсе. На самом деле кажется, что это работает независимо от того, аннотируете ли вы интерфейс или конкретный класс, и независимо от того, используете ли вы прокси-серверы JDK или CGLib.

Это кажется превосходным решением. Так почему несоответствие? Один из ответов на приведенный выше вопрос предполагает влияние на производительность... но ведь производительность так же важна для безопасности?!

И как решение @Secured решает проблему наследования алмазов (класс реализует 2 интерфейса, оба имеют один и тот же метод @Secured)?


person Corin Fletcher    schedule 09.12.2011    source источник


Ответы (1)


При использовании прокси-серверов JDK и CGLib вы получаете TransactionInterceptor для @Transactional и MethodSecurityInterceptor для @Secured.

Но эти два MethodInterceptors используют разные механизмы для поиска аннотаций в заданных MethodInvocation.

Аннотацию @Secured можно найти по SecuredAnnotationSecurityMetadataSource с использованием AnnotationUtils.findAnnotation(Method method, Class‹A› annotationType), а @Transactional обнаруживается методом AnnotationTransactionAttributeSource с помощью Spr ingTransactionAnnotationParser.

Похоже, что у AnnotationUtils гораздо более продвинутые механизмы поиска аннотаций, поиск как интерфейсов, так и метода, объявляющего иерархию классов.

Вы можете создать свой собственный TransactionAnnotationParser, который использует AnnotationUtils, и это должно обеспечить ту же функциональность, что и @Transactional.

AnnotationUtils возвращает первую найденную аннотацию, так что наследование ромбов происходит именно так.

person Roadrunner    schedule 09.12.2011