2012-03-12 10 views
6

To co wynika z tego pytania:Włącz Wiosną AOP lub AspectJ

Spring autowired bean for @Aspect aspect is null

Moje pierwsze zrozumienie było to, że podczas korzystania z wiosny AOP, zajęcia z adnotacją @Aspect są tworzone jako wiosennych fasoli, więc udało Dependency Injection działałby normalnie. Jednak wydaje się, że obiekt z @Aspect adnotacji tworzony jest jako pojedyncza zewnątrz pojemnika wiosny, stąd ja konieczności konfigurowania go w XML jak tak, aby umożliwić mu jak sprężyna udało Fasola:

<bean id="aspect" class="com.mysite.aspect" factory-method="aspectOf" /> 

ten teraz całkowicie mnie pomylił. Myślałem następująca konfiguracja użyłby sprężyny AOP:

<context:component-scan base-package="com.mysite.aspectPackage"/> 
<aop:aspectj-autoproxy/> 

Więc to skanowanie za pomocą komponentu adnotacji @Aspect-skan tworzenia fasolę aspekcie, a następnie AutoProxy stworzyłoby beanPostProcessor który Prokurenci wszystkie ziarna w moim związku z odpowiednim Rada. Następnie pomyślałem o włączeniu aspektu I potrzebowałbym zupełnie innej konfiguracji XML (której, nawiasem mówiąc, nie mogę znaleźć przykładu w dokumentacji). To właśnie ta konfiguracja używa aspektJ do tworzenia aspektów, które znajdowałyby się poza moim kontenerem lub które działałyby poprzez manipulowanie kodem bajtowym zamiast proxy.

Uwaga
To nie jest pytanie o różnicę między AOP wiosna i kształtu J, to jest dobrze przegubowy tutaj:

Spring AOP vs AspectJ

Odpowiedz

5

@Component stworzy 2 instancje, jeden wewnątrz pojemnika wiosna, jeden wewnątrz pojemnika AspectJ.

użyj @Configurable, aby umożliwić wiosną zarządzanie wtryskiem zależności itp. Dla twojej klasy, gdy zostanie utworzone przez pojemnik aspectj.

@Aspect jest adnotacja styl AspectJ, który jest obsługiwany przez wiosny AOP, gdzie czas pracy tkania jest używany do obsługi przechwycenie itp

kompilacji tkania pozwala pominąć stosowanie jako punkty przekroju będzie obecny w kod bajtowy, odbywa się to za pomocą kompilatora aspectj (zobacz http://mojo.codehaus.org/aspectj-maven-plugin/ dla integracji mvn).

Bez względu na to, czy użyjesz kompilatora aspectj, czy spring-aop, nie stworzysz aspektu jako zarządzanego komponentu w sposób jaki chcesz, chyba że użyjesz fabryki/konfiguracji.

Konfiguracja Aspectj to ściśle określone definicje skrótów itp., Które będą obecne w klasie.

+0

Próbowałem tego ze sprężyną 4.3 i aspektem adnotacji z '@ Aspect'' @ Component' działa idealnie dobrze nawet z DI, tak jak @Bozho napisał w swojej odpowiedzi – csharpfolk

8

@Aspect nie jest adnotacja wiosna, a to nie jest wykrywane przez skanowanie składnika. Musisz więc zarejestrować go jak sprężynę. Roztwór aspectOf działa. Można również spróbować

@Aspect 
@Component 
+0

Jaka jest różnica między konfiguracją aspectJ a konfiguracją AOP? – mogronalol

+1

to działa? Zauważyłem, że jeśli to zrobię, wiosna tworzy dwa wystąpienia tej klasy i tę, która jest używana, ponieważ aspekt nie ma wstrzykniętych zależności. –

-1

Zastosowanie

  • @Aspect
  • @Configurable

również dodać "< kontekst: wiosna skonfigurowane />" w pliku konfiguracyjnym XML.