2012-01-29 14 views
10

Estoy intentando usar Spring AOP con Spring MVC Controller. Tengo 3 aspectos, y quiero que estén en orden específico. Con el fin de hacer esto, yo uso la interfaz ordenados y poner en práctica el método getOrder:Aspectos de pedido con Spring AOP && MVC

@Aspect 
@Component 
public class LoggingAspect implements Ordered{ 

public int getOrder() { 
System.out.println("Abra"); 
return 1; 
} 

aconsejó clase:

@Component 
@Controller 
public class HomeController { 

pointcuts:

@Aspect 
public class SystemArchitecture { 

    @Pointcut("execution (* com.jajah.StorageManager.HomeController.*(..))") 
    public void inHomeController(){} 

    @Pointcut("execution (* com.jajah.StorageManager.HomeController.*(..))") 
    public void loggable(){} 

    @Pointcut("execution (* com.jajah.StorageManager.HomeController.*(..))") 
    public void authenticated(){} 

} 

Configuración:

<?xml version="1.0" encoding="UTF-8"?> 
<beans:beans xmlns="http://www.springframework.org/schema/mvc" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:beans="http://www.springframework.org/schema/beans" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:aop="http://www.springframework.org/schema/aop" 
    xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd 
     http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd 
     http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"> 

    <annotation-driven /> 
    <context:annotation-config /> 
    <aop:aspectj-autoproxy proxy-target-class="false"/> 

    <beans:bean id="AuthenticationAspect" class="com.jajah.CommonAspects.SecurityAspects.OAuthAspect"/> 
    <beans:bean id="ErrorHandlingAspect" class="com.jajah.StorageManager.Aspects.ErrorHandlingAspect"/> 


    <!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory --> 
    <resources mapping="/resources/**" location="/resources/" /> 

    <!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory --> 
    <!-- <beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
     <beans:property name="prefix" value="/WEB-INF/views/" /> 
     <beans:property name="suffix" value=".jsp" /> 

    </beans:bean> --> 

    <beans:bean name="homeController" class="com.jajah.StorageManager.HomeController"> 
     <beans:constructor-arg>  
      <beans:ref bean="CloudStorage"/> 
     </beans:constructor-arg> 
     <beans:constructor-arg>  
      <beans:ref bean="ConfigurationContainer"/> 
     </beans:constructor-arg> 
    </beans:bean> 

    <beans:bean id="CloudStorage" name="CloudStorage"  class="com.jajah.StorageManager.CloudStorageProxy"  scope="singleton"> 
     <beans:constructor-arg>  
     <beans:ref bean="ConfigurationContainer"/> 
     </beans:constructor-arg> 
    </beans:bean> 

    <beans:bean id ="ConfigurationContainer" class="com.jajah.StorageManager.ConfigurationContainer" scope="singleton"/> 





</beans:beans> 

El getOrder doesn No hagas el truco. Agradeceré cualquier consejo práctico, o si no tiene la respuesta exacta agradeceré cualquier conocimiento teórico sobre Spring Proxy y el mecanismo de tejido.

Voy a publicar cualquier código/configuración requerida a pedido. Gracias por leer.

Actualización: 1. Intenté @Order (1) con el mismo resultado. 2. Traté de mover aspectos al mismo paquete, cambió su orden, pero aún así no pude controlarlo.

Respuesta

16

No necesita implementar la interfaz Ordenada.

En Spring AOP puede hacer las cosas mucho más fácilmente.

@Aspect 
@Order(1) 
public class AspectA 
{ 
    @Before("............") 
    public void doit() {} 
} 

@Aspect 
@Order(2) 
public class AspectB 
{ 
    @Before(".............") 
    public void doit() {} 
} 

Actualización:

@Aspect 
@Order(1) 
public class SpringAspect { 

    @Pointcut("within(com.vanilla.service.MyService+)") 
    public void businessLogicMethods(){} 

    @Around("businessLogicMethods()") 
    public Object profile(ProceedingJoinPoint pjp) throws Throwable { 
      System.out.println("running Advice #1"); 
     Object output = pjp.proceed(); 
     return output; 
    } 
} 

@Aspect 
@Order(2) 
public class SpringAspect2 { 

    @Pointcut("within(com.vanilla.service.MyService+)") 
    public void businessLogicMethods(){} 

    @Around("businessLogicMethods()") 
    public Object profile(ProceedingJoinPoint pjp) throws Throwable { 
      System.out.println("running Advice #2"); 
     Object output = pjp.proceed(); 
     return output; 
    } 
} 

Ahora la aplicación de configuración XML Contexto:

<context:annotation-config /> 
<aop:aspectj-autoproxy /> 

    <bean id="springAspect" class="com.vanilla.aspect.SpringAspect" /> 
    <bean id="springAspect2" class="com.vanilla.aspect.SpringAspect2" /> 

Necesita habilitar proxy AOP:

<aop:aspectj-autoproxy /> 

de lo contrario, ningún consejo se activará.

Actualización 2:

acabo de hacer una investigación sobre este asunto. La anotación @order funciona solo en el proxy AOP basado en Spring (que estoy usando en mi ejemplo). De acuerdo con la documentación, si está utilizando el tejido debe utilizar la opción de declarar prioridad.

Actualización 3

  1. no veo ningún consejos en su código, sólo los aspectos y puntos de corte.
  2. Si sus clases de asesoramiento son: x.y.z.SystemArchitecture

entonces usted necesita para configurarlo como en

<bean id="systemArchitecture" class="x.y.z.SystemArchitecture" /> 

y yo no lo veo en el código.

  1. "execution (* com.jajah.StorageManager.HomeController. * (..))" ¿a qué se dirigen? ¿Puedes escribirlo usando palabras?

De todos modos. Por favor envíeme un mensaje en Facebook y le enviaré un ejemplo de trabajo que hace exactamente lo que está tratando de hacer.

+0

En realidad comencé con la anotación @Order, pero cuando no funcionó intenté implementar la interfaz ordenada y agregué System.out para verificar que el proxy al menos trata de ordenar aspectos. No funcionó. –

+0

Luego tiene el problema con la configuración de AOP. Por favor, mira mi código actualizado que funciona perfecto en mi entorno de prueba. No olvide que debe configurar el tipo de corte y sugerencia (alrededor, antes o después). –

+0

Defino pointcut, y los aspectos funcionan. El problema es simplemente ordenar. Por cierto, yo aconsejo sobre el controlador, ¿puede ser el problema? ¿Quizás conozcas alguna forma de depurar el tejido? –

Cuestiones relacionadas