Аспект и весна с аспектом-автопрокси
Я объявил свои аспекты с помощью аннотации @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 для методов, вызываемых внутри.