Spring Аспекты не выполняются

Я работаю над добавлением аспектов в веб-приложение Spring MVC, и эти аспекты не выполняются. Я пытался свести это к чему-то простому, что явно должно работать, но все равно не получилось. Вот где я сейчас:

// imports...
@Aspect
public class AuthCheckerAspect {
    {
        System.out.println("initting");
    }

    @Pointcut("execution(* * *(..))")
    public void c() {}

    @Before("c")
    public void cc(JoinPoint pjp) throws Throwable {
        System.out.println("test...");
    }
 }

Насколько я могу судить, pointcut должен применяться к любому методу в любом классе, управляемом Spring (которых в моем приложении много). Я также добавил следующее в свою конфигурацию Spring:

<aop:aspectj-autoproxy/>

Я установил точку останова на операторе System.out.println() в методе cc(), но он так и не сработал (и да, я уверен, что отладчик подключен; другие точки останова работают правильно). Я подозреваю, что класс AuthCheckerAspect никогда не загружается в контекст Spring, потому что я также устанавливаю точку останова в предложении инициализатора, и это тоже никогда не ловится; когда я делаю то же самое с другими классами, управляемыми Spring, их точки останова всегда срабатывают во время запуска приложения.

Есть ли что-то еще, что мне нужно сделать?

Заранее спасибо.


person Dave Taubler    schedule 17.11.2011    source источник
comment
Как вы вызываете метод, расширенный аспектом. Из того же компонента (например, this.otherMethod()) или из другого компонента (например, otherBean.otherMethod())?   -  person Ralph    schedule 17.11.2011
comment
Эй, Ральф, если вы спрашиваете о методах, к которым будет применяться аспект, тогда они будут вызываться другими компонентами, управляемыми Spring.   -  person Dave Taubler    schedule 18.11.2011
comment
Хорошо, проблема со швами решена.   -  person Ralph    schedule 18.11.2011


Ответы (2)


Spring не управляет автоматически @Aspects. Добавьте <bean class="AuthCheckerAspect" /> в свой контекст или аннотируйте его с помощью @Component и включите в путь сканирования компонента.

person madhead    schedule 17.11.2011
comment
Спасибо. Я пробовал каждый, но каждый раз все приложение просто не запускалось. попробую разобраться почему... - person Dave Taubler; 17.11.2011
comment
Хм... java.lang.IllegalArgumentException: Pointcut имеет неправильный формат: ожидается '(' в позиции символа 0. Во всяком случае, вы, похоже, помогли мне преодолеть одно препятствие, поэтому +1 . - person Dave Taubler; 17.11.2011
comment
Посмотрите здесь (static.springsource.org /spring/docs/3.0.x/) для примеров синтаксиса pointcut. - person madhead; 17.11.2011
comment
Спасибо. Я уверен, что реальная проблема заключается в чем-то другом, поскольку я вставлял точки, которые успешно использую в других частях приложения (например, для управления транзакциями). Это очень странно... - person Dave Taubler; 17.11.2011
comment
Ага, я решил последнюю проблему! Ошибка немного вводила в заблуждение; кажется, это был не мой точечный удар, который был плохим, а скорее совет. @Before(c) должен был содержать круглые скобки, например @Before(c()) - person Dave Taubler; 18.11.2011

добавьте это в свой файл конфигурации:

<context:annotation-config />
<context:component-scan base-package="root.package.to.be.scanned" />
<aop:aspectj-autoproxy>
    <aop:include name="nameOfAspectBean" />
</aop:aspectj-autoproxy>
person ruhsuzbaykus    schedule 17.11.2011