2014-08-12 3 views
1

Я получил эту аннотацию и аспектно классAspectJ с Spring Security

@Retention(RetentionPolicy.RUNTIME) 
@Target(ElementType.METHOD) 
public @interface AroundHere { 
} 

@Aspect 
@Component 
public class SomeAspect { 
    @Around("@annotation(com.annotation.AroundHere)") 
    public Object redirectIfNotEditingStatus(ProceedingJoinPoint pjp) throws Throwable { 

     System.out.println("hi"); 

     return pjp.proceed(); 
    } 
} 

Я хочу напечатать «привет» на некоторых методах, которая имеет @AroundHere аннотацию. Он отлично работает на уровне обслуживания, но не работает над контультерами. Я подозреваю Spring Security, потому что он сканирует все компоненты контроллера.

Как я могу заставить их работать на контроллерах?

+2

Возможно, контроллеры определены в определении веб-контекста, а ваши сервисы (и ваш аспект) определены в контексте приложения? – micha

+2

Как сказал @micha, скорее всего, он не работает для вас, потому что 'aop: aspectj-autoproxy' определяется в одном контексте приложения, и у вас есть ваши контроллеры в другом контексте приложения. Как правило, 'BeanFactoryProcessors' (которые выполняют фактическую работу, когда' aop: aspectj-autoproxy' находится в контексте) действуют только на компоненты в контейнере, где они определены. Так, например, если у вас есть 'aspectj-autoproxy', определенный в контексте корневого приложения, он не будет действовать на компоненты, определенные в контексте * -servlet.xml. –

+0

Другая причина может заключаться в том, что службы обычно реализуют интерфейс, в то время как контроллеры этого не делают. А Spring AOP нужен компонент, реализующий интерфейс. –

ответ

3

Скорее всего, это не работает для вас, потому что aop:aspectj-autoproxy определен в одном контексте приложения, и у вас есть свои контроллеры в другом контексте приложения. Как правило, BeanFactoryProcessors (которые выполняют фактическую работу, когда aop:aspectj-autoproxy в контексте) действуют только на компоненты в контейнере, где они определены. Так, например, если у вас есть aspectj-autoproxy, определенный в контексте корневого приложения, он не будет действовать на компоненты, определенные в контексте *-servlet.xml.

Вы можете найти соответствующую часть документации, связанной с этой темой here:

BeanPostProcessors находятся в области видимости за контейнер. Это актуально только в том случае, если вы используете иерархии контейнеров. Если вы определите BeanPostProcessor в одном контейнере, он будет только обрабатывать компоненты в этом контейнере. Другими словами, бобы, которые определены в одном контейнере, не обрабатываются обработчиком BeanPostProcessor, определенным в другом контейнере, даже если оба контейнера являются частью одной и той же иерархии.

Смежные вопросы