2011-06-17 18 views
6

Deklarowałem moje aspekty za pomocą adnotacji @Aspect, ale porady nie wydają się być stosowane. Aspekt ten działa w kilku innych projektach, które mam, a kluczową różnicą wydaje się być to, że inne projekty są całkowicie połączone za pomocą adnotacji, a ten konkretny projekt jest przewodowy. Jedynym komponentem, który jest opatrzony adnotacją, jest aspekt. Zastanawiam się więc, czy obsługa aspectj wiosenna, przy użyciu aspectj-autoproxy jest wrażliwa na kolejność definiowania ziaren w xml.aspectj i sprężyna z aspectj-autoproxy

Na przykład, czy fasole zadeklarowane po aspekcie aspectj-autoproxy w xml będą brane pod uwagę w punktach AOP?

EDIT:

przeniosłem <aop:aspectj-autoproxy /> aż po wszystkie ziarna są tworzone i nadal nie ma szczęścia.

Zasadniczo mój kod składa się z:

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

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

A mój kontroler ma coś takiego:

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

A potem xml wiosną jest: schwytany

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

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

Moje poprzednie projekty i załadował wszystkie ziarna poprzez skanowanie składników. Tym razem jest inaczej.

EDIT2: Inna różnica polega na tym, że inne projekty używają @Controller i @RequestMethod. I w tym przypadku używam klasy pochodnej AbstractCommmandController. Zastanawiam się, czy to dotyczy: http://forum.springsource.org/archive/index.php/t-46637.html

Mianowicie, nie mogę zastosować porady do żadnej metody z wyjątkiem handleRequest().

Edit3:

Moja ostatnia próba jest przesłonić handleRequest() i zastosować tam mój adnotacji. Przy założeniu, że kiedy wiosną prokuruje mój kontroler, zobaczy adnotację i zastosuje radę, ponieważ odwołuje się publicznie, zewnętrznie nazywaną metodą. To nadal nie działa.

+0

Napisz kod; na przykład appcontext, który definiuje aspekt, poradę i pointcut (s). – abalogh

+0

@abalogh: Mam wrażenie, że upraszczam kod, który zadziała. Jaki jest najlepszy sposób debugowania aspektj/wiosna, gdy te rzeczy nie działają zgodnie z oczekiwaniami? – Kevin

Odpowiedz

3

Widzę, że wywołuje się metodę handleX bezpośrednio z innej metody w tej samej klasie. Nie będzie to respektować, ponieważ praca nad przetwarzaniem adnotacji AOP jest wykonywana przez serwer proxy JDK, który otula twoją klasę i udostępnia te same interfejsy.

Jest możliwe, że można obejść to, używając CGLIB zamiast proxy JDK, ale z mojego doświadczenia, najbardziej niezawodnym rozwiązaniem jest po prostu nie poleganie na adnotacjach AOP dla metod zwanych wewnętrznie.

+0

Tak, teraz to rozumiem. Ale nie mogę wywołać metody spring handle(), ponieważ jest ona chroniona, a poza tym to tylko metoda wewnętrzna (!). To nie jest metoda, którą wiosna nazywa "zewnętrznie". Ale chcę osiągnąć to przechwycić i zastosować porady dotyczące podzbioru wszystkich kontrolerów. Naprawdę nie wiem, jak to zrobię bez korzystania z @ Controller/@ RequestMethod. Propozycje? – Kevin

+0

Zaznaczę to jako właściwą odpowiedź, ale były dwie kwestie.Najpierw musiałem nadpisać publiczną metodę handleRequest i umieścić tam moją adnotację. Drugi aspektj-autoproxy musi nastąpić dopiero po utworzeniu wszystkich komponentów. Wtedy wszystko działa. – Kevin

+0

Szczerze mówiąc nie użyłem aspectj-autoproxy. W większości korzystam z innych integracji AOP (@Transactional, niektóre z materiałów Spring Security itp.). Jeden z moich kolegów znalazł problem, że adnotacje Spring Security nie wydają się być przestrzegane w metodach kontrolera za pomocą @RequestMapping. Zastanawiam się, czy to jest powiązane. – Dan

Powiązane problemy