2014-01-08 60 views
3

我使用的是Spring 3.2AspectJ 1.7.1。 (我不太可能在不久的將來升級到更高版本。)抽象類的受保護方法的彈簧切入點

我需要爲抽象類中的受保護方法定義一個切入點。據我所知,我需要AspectJ對於不公開的方法,所以我只試過這與(AspectJ)註釋:

package com.aspects; 
@Aspect 
public class Aspect{ 

    @Before("execution(* com.x.y.x.MyClass.myMethod(..))") 
    public void beforeAspect(){ 
     //do something here 
    } 

} 

在我beans.xml我:

<aop:aspectj-autoproxy /> 
<bean id="myAspect" class="com.aspects.Aspect"/> 

我已經檢查過我的Aspect類被創建(構造函數被調用),應用程序啓動時不會拋出異常。 但是我無法獲得beforeAspect的調用。對於非抽象類中的公共方法,這是有效的。我怎樣才能使它在抽象類中受保護的方法工作?

回答

4

您應該在抽象類後添加一個+符號。

所以

"execution(* com.x.y.x.MyClass.myMethod(..))" 

應該是這樣的:

"execution(* com.x.y.x.MyClass+.myMethod(..))" 
           ↑ 

+是關於繼承或者延長給定類(MyClass)或實現一個接口。

+0

感謝您的幫助。我會嘗試一下,並會(希望)回來的解決方案。 – Atticus

2

其實你正在使用@AspectJ風格來配置Spring AOP。 <aop:aspectj-autoproxy>聲明AnnotationAwareAspectJAutoProxyCreatorBeanPostProcessor,但您需要改爲運行aspectj編譯器。

請參閱9.8 Using AspectJ with Spring applications參考文檔以獲取有關使用Spring編織方面的更多信息。

請參閱Spring/@Transactional with AspectJ is totally ignored瞭解更多關於使用maven編譯時間的編譯時間信息。

+0

感謝提示。我正在閱讀文檔。我不知道我沒有使用'AspectJ'編譯器。 – Atticus

相關問題