2011-01-22 155 views
1

內特定的切入點,我開始與原來的問題上 Need help creating a specific pointcut that utilizes a value from a method annotation需要幫助建立的方法

我決定,我想問一個問題,以改變我採用的方法。 我有一個方法(導航),該方法內有一個調用另一個方法,我希望有@Around建議。

@RequestMapping(method = RequestMethod.GET) 
public String navigation(ModelMap model) { 
    ...   
      // Call Auto Handling 
      logger.info("Call AutoHandling"); 
      this.processAutoHandling(callSession, FunctionalArea.PRE_MAIN_MENU); 
     } 
     ... 

    return forward(returnView); 
} 

這是可能的,因爲我似乎無法得到這個工作,如果方法是在同一類內。

這工作,如果它不是對對象本身:

@Around("execution(* *.processAutoHandling(..)) &&" + 
     "args(callSession, functionalArea) && " + 
     "args(functionalArea) && " + 
     "target(bean)" 
) 
public Object processAutoHandlingCall2(ProceedingJoinPoint jp, 
             CallSession callSession, 
             FunctionalArea functionalArea, 
             Object bean) 
     throws Throwable { 
    logger.debug("processAutoHandleCall"); 
    return jp.proceed(); 
} 

通過此調用在我的控制器:中

autoHandlingComponent.processAutoHandling(callSession, FunctionalArea.PRE_MAIN_MENU); 

代替

this.processAutoHandling(callSession, FunctionalArea.PRE_MAIN_MENU); 

回答

1

看來你是使用Spring的基於代理的AOP。如果是這樣,這是一個已知的限制。有關更多詳細信息,請參閱Spring文檔中的Understanding AOP Proxies。您有兩種方法可以解決此問題:

  1. 使用文檔中概述的AopContext.currentProxy()方法。我會勸阻這種方法,因爲你的代碼現在已經非常明確地與Spring AOP綁定了。
  2. 使用AspectJ的字節碼編織。由於沒有涉及代理的代理,因此您不會遇到'this'指向原始對象的問題,代理僅透明地可用於外部對象。