2012-03-12 10 views
6

Esto es consecuencia de lo anterior pregunta:Habilitar primavera AOP o AspectJ

Spring autowired bean for @Aspect aspect is null

Mi comprensión inicial fue que cuando se utiliza la primavera AOP, clases con anotada @Aspect se crean como granos de primavera logrado, por lo que la inyección de dependencias funcionaría de manera normal. Sin embargo, parece que un objeto con la anotación @Aspect se crea como un conjunto unitario fuera del recipiente de la primavera, de ahí que yo tenga que configurarlo en XML como tal a fin de que como un resorte bean gestionado:

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

Este ahora me ha confundido por completo Pensé que la siguiente configuración usaría la primavera AOP:

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

por lo que sería explorar en busca de anotaciones @Aspect utilizando el componente de exploración creación de granos de aspecto, y luego autoproxy crearía un beanPostProcessor el que actúe como su apoderado todos los granos dentro de mi contexto con la adecuada Consejo. Luego pensé en habilitar un aspecto. Necesitaría una configuración XML completamente diferente (que, por cierto, no puedo encontrar un ejemplo en la documentación). Sería esta configuración la que usa aspectJ para crear aspectos que estarían fuera de mi contenedor o que funcionan manipulando bytecode en lugar de usar proxy.

Nota
Esto no es una pregunta sobre la diferencia entre el AOP primavera y el aspecto J, esto está bien articulado aquí:

Spring AOP vs AspectJ

Respuesta

5

@Component creará 2 casos, uno dentro del contenedor de primavera, uno dentro del contenedor aspectj.

utilice @Configurable para permitir que el muelle administre la inyección de dependencia, etc. para su clase cuando el contenedor aspectj crea una instancia.

@Aspect es una anotación estilo aspectj que se apoya en la primavera-AOP, donde se utiliza tejido de tiempo de ejecución para manejar la interceptación etc.

tiempo de compilación tejer le permite no tener en cuenta el uso de puntos de corte que estarán presentes en el bytecode, esto se hace a través del compilador aspectj (Ver http://mojo.codehaus.org/aspectj-maven-plugin/ para la integración de mvn).

Si utiliza el compilador aspectj o spring-aop no importa, no creará su aspecto como un frijol administrado de la manera que desee a menos que use fábrica/configurable.

Aspectj configuración es, estrictamente, las definiciones de punto de corte, etc. que estarán presentes dentro de su clase.

+0

Probé esto con la primavera 4.3 y el aspecto de anotación con '@ Aspect'' @ Component' funciona perfectamente bien incluso con DI, al igual que @Bozho escribió en su respuesta – csharpfolk

8

@Aspect no es una anotación de primavera, y no es detectado por componente-escaneo. Entonces tienes que registrarlo de alguna manera como un bean de primavera. La solución aspectOf funciona. También puede intentar

@Aspect 
@Component 
+0

Entonces, ¿cuál es la diferencia entre una configuración aspectJ y una configuración de AOP de resorte? – mogronalol

+1

hace esto? Estoy descubriendo que si lo hago esta primavera crea dos instancias de la clase y la que se usa como aspecto no tiene sus dependencias inyectadas. –

-1

Uso

  • @Aspect
  • @Configurable

También añadir "< contexto: primavera-configurado />" en el archivo de configuración XML.

Cuestiones relacionadas