2012-01-29 30 views
10

Tôi đang cố gắng sử dụng Spring AOP với Bộ điều khiển Spring MVC. Tôi có 3 khía cạnh và muốn được theo thứ tự cụ thể. Để làm điều này, tôi sử dụng Ordered giao diện và thực hiện các phương pháp getOrder:Đặt hàng các khía cạnh với Spring AOP && MVC

@Aspect 
@Component 
public class LoggingAspect implements Ordered{ 

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

Adviced lớp:

@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(){} 

} 

Cấu hình:

<?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> 

GetOrder không không làm trò lừa. Tôi sẽ đánh giá cao bất kỳ lời khuyên thực tế nào, hoặc nếu bạn không có câu trả lời chính xác, tôi sẽ đánh giá cao bất kỳ kiến ​​thức lý thuyết nào về Spring Proxy và cơ chế dệt.

Tôi sẽ đăng bất kỳ Mã/Cấu hình nào theo yêu cầu. Cảm ơn bạn đã đọc.

Cập nhật: 1. Tôi đã thử @Order (1) với cùng một kết quả. 2. Tôi cố gắng di chuyển các khía cạnh sang cùng một gói, nó đã thay đổi thứ tự của chúng, nhưng tôi vẫn không thể kiểm soát nó.

Trả lời

16

Bạn không cần triển khai Giao diện được đặt hàng.

Vào mùa xuân AOP bạn có thể làm mọi việc dễ dàng hơn nhiều.

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

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

Cập nhật:

@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; 
    } 
} 

Bây giờ ứng dụng Context cấu hình XML:

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

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

Bạn cần phải bật AOP proxy bằng cách:

<aop:aspectj-autoproxy /> 

nếu không không có lời khuyên nào được kích hoạt.

Cập nhật 2:

Tôi chỉ làm một nghiên cứu về vấn đề này. @order chú thích chỉ hoạt động trên AOP dựa trên proxy của Spring (Mà tôi đang sử dụng trong ví dụ của tôi). Accoridng để tài liệu nếu bạn đang sử dụng dệt, bạn nên sử dụng tùy chọn khai báo ưu tiên.

Cập nhật 3

  1. Tôi không thấy bất kỳ lời khuyên trong mã của bạn, chỉ cần các khía cạnh và pointcuts.
  2. Nếu lớp Tư vấn của bạn là: x.y.z.SystemArchitecture

sau đó bạn cần phải cấu hình nó ở như

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

và tôi không nhìn thấy nó trong mã của bạn.

  1. "thực thi (* com.jajah.StorageManager.HomeController. * (..))" bạn đang nhắm mục tiêu gì? Bạn có thể viết nó bằng lời không?

Dù sao. Xin vui lòng thả cho tôi một tin nhắn trên facebook và tôi sẽ gửi cho bạn ví dụ làm việc mà không chính xác những gì bạn đang cố gắng để làm.

+0

Thực ra tôi đã bắt đầu với chú thích @Order, nhưng khi nó không hoạt động, tôi đã cố gắng triển khai giao diện Ordered và thêm System.out để xác minh rằng proxy ít nhất cố gắng đặt hàng các khía cạnh. Nó không hoạt động. –

+0

Sau đó, bạn có vấn đề với cấu hình AOP. Vui lòng xem mã cập nhật của tôi chạy hoàn hảo trong môi trường thử nghiệm của tôi. Đừng quên rằng bạn cần cấu hình loại POintcut và Advice (Xung quanh, trước hoặc sau). –

+0

Tôi xác định đường cắt và các khía cạnh đang hoạt động. Vấn đề là chỉ cần đặt hàng. Bằng cách tôi khuyên trên bộ điều khiển, nó có thể là vấn đề? Có lẽ bạn biết một số cách để gỡ lỗi dệt? –

Các vấn đề liên quan