2010-05-04 13 views
9

He creado dos puntos de corte de Spring AOP que están completamente separados y se tejen para diferentes partes del sistema. Los puntos de corte se utilizan en dos consejos diferentes, estos consejos de alrededor apuntarán al mismo método de Java.Spring aop puntos de corte y consejos múltiples, pero solo el último está funcionando

¿Cómo se ve el archivo xml:

<aop:config> 
    <aop:pointcut expression="execution(......)" id="pointcutOne" /> 
    <aop:pointcut expression="execution(.....)" id="pointcurTwo" /> 

    <aop:aspect id="..." ref="springBean"> 
     <aop:around pointcut-ref="pointcutOne" method="commonMethod" /> 
     <aop:around pointcut-ref="pointcutTwo" method="commonMethod" /> 
    </aop:aspect> 
</aop:config> 

El problema es que sólo funciona el último punto de corte (si cambio el orden pointcutOne obras, ya que es el último). He conseguido que funcione al crear un gran punto de corte, pero me gustaría separarlos. ¿Alguna sugerencia de por qué solo uno de los puntos de acceso funciona a la vez?

+0

Supongo que 'aop: aroung' es un error tipográfico en la pregunta solamente. – Bozho

+0

sí, lo siento. –

Respuesta

6

Trate de tener el punto y el consejo dentro del elemento <aop:aspect>. Algo como esto:

<aop:config> 
    <aop:aspect id="aspect1" ref="springBean"> 
    <aop:pointcut expression="execution(......)" id="pointcutOne" /> 
    <aop:around pointcut-ref="pointcutOne" method="commonMethod" /> 
    </aop:aspect> 

    <aop:aspect id="aspect2" ref="springBean"> 
    <aop:pointcut expression="execution(.....)" id="pointcurTwo" /> 
    <aop:around pointcut-ref="pointcutTwo" method="commonMethod" /> 
    </aop:aspect> 
</aop:config> 

supongo que su configuración XML resultó en un solo objeto proxy, mientras que debería haber sido dos objetos proxy.


BTW: Usted debe considerar el uso de la sintaxis @AspectJ lugar. Es solo Java con puntos de corte y consejos en anotaciones. Funciona bien con Spring AOP y ofrece más funcionalidades que la alternativa XML.

Todo lo que necesita en su configuración para habilitar @AspectJ aspectos con la primavera AOP:

<aop:aspectj-autoproxy> 
    <aop:include name="aspect1" /> 
    <aop:include name="aspect2" /> 
</aop:aspectj-autoproxy> 

<bean id="aspect1" class="com.demo.Aspect1"/> 
<bean id="aspect2" class="com.demo.Aspect2"/> 

y el aspecto que podría ser algo como esto:

@Aspect 
public class Aspect1 { 

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

    @Around("demoPointcut()") 
    public void demoAdvice(JoinPoint joinPoint) {} 
} 

Actualizado:

Ejemplo que usa un punto de corte para combinar otros tres puntos de corte:

@Pointcut("traceMethodsInDemoPackage() && notInTestClass() " + 
    "&& notSetMethodsInTraceDemoPackage()") 
public void filteredTraceMethodsInDemoPackage() {} 
+0

Mismo problema, esto es muy extraño. Funciona bien cuando solo tengo un punto de corte, pero rápidamente se vuelve muy grande. Gracias por las sugerencias sobre el uso de anotaciones. Estoy totalmente de acuerdo contigo en que es una mejor solución que usar xml. Tengo puntos de referencia similares a las anotaciones además del xml, pero también quería dar soporte a xml porque permitirá que el proyecto principal modifique los aspectos sin volver a compilar. –

+0

Eso es extraño. Los objetos proxy deberían haberse llamado recursivamente antes y después del método asesorado por su punto de unión. Si funciona con un punto de corte, puede crear un tercer punto de corte que combine los dos primeros y usar esto en el consejo de alrededor. – Espen

+0

Usar las anotaciones funciona muy bien, así que creo que actualizaré al menos la mayoría de los aspectos para usar esto en lugar de xml. Solo debemos ser conscientes de que necesitamos recompilar para hacer cambios. ¡Gracias por la ayuda! –

Cuestiones relacionadas