2012-03-12 18 views
6

Questo è sulla scia a questa domanda:Abilita Spring AOP o AspectJ

Spring autowired bean for @Aspect aspect is null

mia comprensione iniziale era che quando si usa Spring AOP, classi annotate con @Aspect vengono creati i fagioli di primavera gestito, in modo da iniezione di dipendenza funzionerebbe normalmente Tuttavia sembra che un oggetto con l'annotazione @Aspect viene creata come Singleton di fuori del contenitore primaverile, quindi me dover configurarlo in XML in questo modo al fine di consentire come una molla bean gestito:

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

Questo ora mi ha completamente confuso. Ho pensato che la seguente configurazione userebbe primavera AOP:

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

quindi sarebbe la scansione per le annotazioni @Aspect utilizzando componente-scan creazione di fagioli aspetto, e quindi proxy automatico creerebbe una beanPostProcessor i proxy tutti i fagioli nel mio contesto con l'appropriato consigli. Ho quindi pensato di abilitare aspectJ Avrei bisogno di una configurazione XML completamente diversa (che per inciso non riesco a trovare un esempio nella documentazione). Sarebbe questa configurazione che usa aspectJ per creare aspetti che sarebbero al di fuori del mio contenitore o che funzionano manipolando bytecode piuttosto che proxy.

Nota
Questa non è una domanda sulla differenza tra la primavera AOP e l'aspetto J, questo è ben articolato qui:

Spring AOP vs AspectJ

risposta

5

@Component creerà 2 istanze, uno all'interno del contenitore di Primavera, una all'interno del contenitore AspectJ.

utilizzare @Configurable per consentire a Spring di gestire l'iniezione di dipendenza ecc. Per la classe quando viene creata un'istanza dal contenitore aspectj.

@Aspect è un'annotazione stile aspectj supportato dalla molla-AOP, dove tessitura runtime viene utilizzato per gestire intercettazione ecc

fase di compilazione tessitura consente di ignorare l'uso come pointcut saranno presenti in il bytecode, questo viene fatto tramite il compilatore aspectj (vedi http://mojo.codehaus.org/aspectj-maven-plugin/ per l'integrazione con mvn).

Se si utilizza il compilatore aspectj o spring-aop non fa alcuna differenza, non creerà il tuo aspetto come bean gestito nel modo desiderato, a meno che non si usi factory/configurable.

La configurazione di Aspectj è, rigorosamente, le definizioni pointcut ecc che saranno presenti all'interno della classe.

+0

Ho provato questo con spring 4.3 e l'annotazione dell'aspetto con '@ Aspect'' @ Component' funziona perfettamente anche con DI, proprio come @Bozho ha scritto nella sua risposta – csharpfolk

8

@Aspect non è un'annotazione di primavera, e non è rilevato da component-scan. Quindi devi registrarlo in qualche modo come un fagiolo di primavera. La soluzione aspectOf funziona. Si può anche provare

@Aspect 
@Component 
+0

quindi qual è la differenza tra una configurazione aspectJ e una configurazione AOP molla? – mogronalol

+1

funziona? Sto scoprendo che se faccio questa primavera creo due istanze della classe e quella che viene usata come aspetto non ha le sue dipendenze iniettate. –

-1

Usa

  • @Aspect
  • @Configurable

anche aggiungere "< contesto: la primavera-configurati />" nel file di configurazione XML.

Problemi correlati