2008-09-02 142 views
7

我的項目基於spring framework 2.5.4。我嘗試爲某些控制器添加方面(我使用aspectj 1.5.3)。Aspectj沒有捕獲到Spring框架中的所有事件?

我已經啓用自動代理在應用servlet.xml中,剛剛粘貼這些行到XML文件的末尾:

<aop:aspectj-autoproxy /> 
<bean id="auditLogProcessor" class="com.example.bg.web.utils.AuditLogProcessor" /> 

創建方面:

package com.example.bg.web.utils; 

import org.apache.log4j.Logger; 
import org.aspectj.lang.annotation.After; 
import org.aspectj.lang.annotation.Aspect; 
import org.aspectj.lang.annotation.Pointcut; 

@Aspect 
public class AuditLogProcessor 
{ 
    private final static Logger log = Logger.getLogger(AuditLogProcessor.class); 

    @After("execution(* com.example.bg.web.controllers.assets.AssetThumbnailRebuildController.rebuildThumbnail(..))") 
    public void afterHandleRequest() { 
     log.info("test111"); 
    } 

    @After("execution(* com.example.bg.web.controllers.assets.AssetThumbnailRebuildController.rebuildThumbnail(..))") 
    public void afterRebuildThumbnail() { 
     log.info("test222"); 
    } 
}

我的控制器:

class AssetAddController implements Controller 
class AssetThumbnailRebuildController extends MultiActionController

當我在aspect advisors中設置制動點並調用控制器時,我只捕獲afterHandleRequest()但不是afterRebildThumbnail() 我做錯了什麼?

注意

我問代表我朋友的這個問題,誰不具有左右的測試訪問,我沒有什麼線索它的全部。

編輯

有的確有些拼寫錯誤,謝謝Cheekysoft。但問題仍然存在。

回答

2

斷點沒有被擊中,因爲你正在使用Spring的AOP代理。有關AOP代理如何特殊的說明,請參閱understanding-aop-proxies

基本上,MVC框架將調用你的控制器的代理上的handleRequest方法(例如你用作基類的MultiActionController實現),然後這個方法會對它的rebuildThumbnail進行「內部」調用方法,但這不會通過代理,因此不會涉及任何方面。 (這與方法最終沒有任何關係。)

爲了實現你想要的,通過加載時織入(其中Spring支持非常好)來調查使用「真正的」AOP。

0

這就像拼寫一樣簡單嗎?或者在問題中只有錯別字? 有時候你寫rebuildThumbnail,有時你寫rebildThumbnail

你正試圖與建議覆蓋的方法是不是在MVC框架的最終方法,所以雖然bpapas答案是有用的,我的理解是,這是沒有問題的在這案件。但是,請確保rebuildThumbnail控制器操作不是最終的

@bpapas:請糾正我,如果我錯了。程序員自己的控制器動作就是他想要重寫的內容。查看MultiActionController源代碼(及其父代),堆棧中唯一可能定位的方法是MultiActionController.invokeNamedMethod,儘管我不能100%確定當時是否在堆棧中。如果在堆棧中使用更高的方法會導致將AOP建議添加到方法中的問題?

1

基本設置看起來不錯。

通過不定義就地切入點並指定應用後通知的方法,可以稍微簡化語法。 (方法的命名切入點會自動爲您創建。)

例如,

@After("com.example.bg.web.controllers.assets.AssetAddController.handleRequest()") 
public void afterHandleRequest() { 
    log.info("test111"); 
} 

@After("com.example.bg.web.controllers.assets.AssetThumbnailRebuildController.rebuildThumbnail()") 
public void afterRebuildThumbnail() { 
    log.info("test222"); 
} 

只要rebuildThumbnail方法不是最終的,並且方法名稱和類是正確的。我不明白爲什麼這不起作用。

看到http://static.springframework.org/spring/docs/2.0.x/reference/aop.html