2012-04-18 11 views
5

Tengo un proyecto que consiste en dos sub-proyectos que son ambos proyectos de primavera y tienen un applicationContext.xml cada uno.Aspecto primavera no ejecuta cuando se define en otra JAR

Uno es un proyecto de framework (que termina como un JAR) y el otro es la aplicación real (que termina en WAR y depende del JAR e importa el applicationContext.xml del JAR en su propia applicationContext.xml).

En el marco del proyecto, he definido un aspecto para todos los métodos públicos.

@Aspect 
@Configurable 
public class MyAspect { 

    @Autowired 
    private SomeBean mBean; 

    @Pointcut("execution(public * *(..))") 
    public void anyPublicMethod() { 
    } 

    @Before("anyPublicMethod()") 
    public void checkAuthorization(JoinPoint pJoinPoint) { 
     mBean.doSomething(); 
    } 
} 

Y He activado el AOP en el applicationContext.xml del marco (que es importado por el applicationContext.xml del proyecto de aplicación real).

... 
    <context:spring-configured /> 

    <context:component-scan base-package="com.mypackage" /> 

    <aop:aspectj-autoproxy/> 
... 

Cuando se prueba en el proyecto de la estructura, el aspecto es ejecutado como se esperaba cuando se llama a los métodos públicos en los granos de la primavera.

Como se indicó anteriormente, el proyecto marco se incluye en el proyecto de aplicación como dependencia pero el aspecto no se ejecuta cuando se llama a métodos de emparejamiento (cualquier públicas) en el proyecto de aplicación en cualquier granos de primavera.

También he intentado usar la configuración de XML del aspecto. Eso lleva al mismo comportamiento.

Respuesta

4

en mi humilde opinión, se puede ajustar un poco el enfoque.

La primera cosa que haría es delegar la configuración del contexto de aplicación para la guerra con el web.xml:

<context-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>WEB-INF/classes/spring*.xml</param-value> 
</context-param> 

En segundo lugar me permitiría AOP en ti contexto de aplicación del archivo de la guerra, ya que es donde quieres usarlo Suena, por el momento, como si estuviera importando el contexto de la aplicación con la configuración de aop solo para obtenerlo en su proyecto web, lo cual tal vez sea incorrecto.

Finalmente estoy asumiendo que estos son aspectos de tiempo de ejecución y no compilados, en este último caso necesitaría recompilar con aspectj en su proyecto de guerra independientemente de la dependencia.

+0

Habilitar el AOP en el contexto de la aplicación no solucionó el problema. – tobiasbayer

+0

También he leído que el autoprocesamiento de primavera solo se aplica a los granos administrados por resorte, que no es configurable. Intente marcarlo como componente por favor? Ref - 7.2.2 Declarar un aspecto http://static.springsource.org/spring/docs/3.0.5.RELEASE/reference/aop.html – MikePatel

+0

Creo que aquí confundes la aplicación de un aspecto con su definición. La documentación dice que un aspecto solo se puede aplicar __applied__ a un Spring Bean. Eso no tiene nada que ver con la declaración del aspecto en sí. Incluso debe funcionar solo con '' @ Aspect'' (sin '' @ Configurable'' o '' @ Component''). En mi ejemplo, el aspecto es '' @ Configurable'' además debido al campo '' @ Autowired'' para ser inyectado. – tobiasbayer

0

Eso es lo que hago:

<context:annotation-config/> 
<context:component-scan base-package="my.pkg" scoped-proxy="interfaces"/> 
<aop:aspectj-autoproxy proxy-target-class="true" /> 

Aunque no puedo decir si va a trabajar en su caso .... que sería útil que se configura una versión simplificada de su proyecto en GitHub.

Esto no requiere ningún tejido de código de bytes o la instrumentación de la JVM. Solo asegúrate de utilizar los atributos de autoinyección cuando llames al método en cuestión, es decir.

@Autowired 
private MyType myTypeInstance; // MyType is usually an interface 

public void someMethod() { 
    // myTypeInstance is actually a proxy object... thereby providing the 
    // access point for the weaving stuff. (as far as I understand it) 
    myTypeInstance.method(); 
} 

De lo contrario, siga these instructions si no te gusta los proxies de clase AOP primavera gestionados.

0

Creo que se necesita para hacer su aspecto un componente que sea reconocida por el resorte:

http://static.springsource.org/spring/docs/3.2.x/spring-framework-reference/html/aop.html#aop-at-aspectj

aspectos autodetección a través del escaneo componente

Se puede registrar clases de aspecto como los frijoles regulares en su configuración XML de Spring, o autodetectarlos a través del análisis de classpath, al igual que cualquier otro Bean administrado por Spring. Sin embargo, tenga en cuenta que la anotación @Aspect no es suficiente para la autodetección en el classpath: para ello, necesita agregar una anotación @Component separada (o una anotación de estereotipo personalizada que califique, según las reglas de Spring's escáner de componentes).

1

En Spring MVC webapps, en realidad tiene 2 contextos: el contexto raíz y el contexto del servlet. Asegúrese de configurar su aspecto en el contexto del servlet del servlet. De hecho, el contexto del servlet "ve" la raíz - y no al revés:

En el marco MVC Web, cada DispatcherServlet tiene su propio WebApplicationContext, que hereda todos los granos ya definidos en la raíz WebApplicationContext. Estos beans heredados pueden ser anulados en el ámbito específico del servlet, y puede definir nuevos beans específicos del ámbito locales para una instancia de Servlet determinada.

Por lo que su importación de la configuración del marco tiene que ser hecho en el archivo [servlet-name]-servlet.xml más que en el otro (s) si desea que los aspectos que se aplicará a sus granos.

Cuestiones relacionadas