Аспект и весна с аспектом-автопрокси

Я объявил свои аспекты с помощью аннотации @Aspect, но совет, похоже, не применяется. Этот аспект работает в нескольких других проектах, которые у меня есть, и ключевое отличие, по-видимому, заключается в том, что другие проекты полностью связаны с использованием аннотаций, и этот конкретный проект является проводным XML. Единственный компонент, который связан с аннотацией, - это Aspect. Поэтому мне интересно, поддерживает ли Spring aspectj, когда при использовании aspectj-autoproxy чувствителен порядок, в котором бины определены в xml.

Например, будут ли bean-компоненты, объявленные после aspectj-autoproxy в xml, рассматриваться как точки AOP?

РЕДАКТИРОВАТЬ:

Я переместил <aop:aspectj-autoproxy /> до тех пор, пока все бобы не будут созданы и до сих пор не повезло.

В основном мой код состоит из:

@Component
@Aspect 
public class SomeAspect {
    @Pointcut("@annotation(MyAnnotation)")
    public void isX() {}

    @After("isX()") 
    public void XX() {
        System.out.println("Called aspect");
    }
}

И мой контроллер имеет что-то вроде:

public class XController extends AbstractCommandController {
    @MyAnnotation
    public void handleX(...) {
        // do stuff
    }
    @Override
    protected void handle(...) {
        return handleX(...);
    }
}

И тогда весна XML:

<context:component-scan base-package="package.of.some.aspect" />
<aop:aspectj-autoproxy />

<!-- the rest of the beans below -->
<bean id="someController" class="..." />

Мои предыдущие проекты захватили и загрузили все bean-компоненты через компонентное сканирование. Вот что отличается в этот раз.

РЕДАКТИРОВАТЬ 2: Другое отличие состоит в том, что другие проекты используют @Controller и @RequestMethod. И в этом случае я использую производный класс AbstractCommmandController. Мне интересно, если это применимо: http://forum.springsource.org/archive/index.php/t-46637.html

А именно, что я не могу применить совет к любому методу, кроме handleRequest().

EDIT3:

Моя последняя попытка - переопределить handleRequest() и применить мою аннотацию там. Предполагается, что когда Spring проксирует мой контроллер, он увидит аннотацию и применит совет, так как он вызывает через открытый, вызываемый извне метод. Это все еще не работает.

1 ответ

Решение

Я вижу, что вы вызываете метод handleX непосредственно из другого метода в том же классе. Это не будет учитывать аннотации, поскольку работа по обработке аннотаций AOP выполняется прокси-сервером JDK, который оборачивает ваш класс и предоставляет те же интерфейсы.

Вполне возможно, что вы можете обойти это, используя CGLIB вместо JDK-прокси, но, по моему опыту, самое надежное решение - просто не полагаться на какие-либо аннотации AOP для методов, вызываемых внутри.

Другие вопросы по тегам