аспект и весна с аспектом-автопрокси - PullRequest
6 голосов
/ 17 июня 2011

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

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

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

Я перемещал <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-компоненты через компонентное сканирование.На этот раз все по-другому.

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

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

EDIT3:

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

1 Ответ

3 голосов
/ 17 июня 2011

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

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

...