2015-10-25 47 views
2

我有經營業務類如下:問題調用內部本身

class A { 
    public void sayHello(String name){ 
     System.out.println("hello "+name); 
    } 
    public void openDoorForJack(){ 
     System.out.println("door opened"); 
     this.sayHello("Jack"); 
    } 
} 

和縱橫類如下:

@Aspect 
class Aspect { 
    @Pointcut("execution (* com..*.sayHello(String)) && args(name)") 
    public void beforeSayHelloPointCut(String name) {} 
    @Before("beforeSayHelloPointCut(name)") 
    public void beforeSayHello(String name) throws Throwable { 
     System.out.println(name+" is knocking"); 
    } 
} 

後,我把所有這些豆在春季配置,我打開LTW使用

<aop:aspectj-autoproxy/> 
<context:load-time-weaver aspectj-weaving="on" weaver-class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver"/> 

當然aspectjrt,aspectj-weaver,spring-instrume NT是位置,-javaagent:路徑/彈簧instrument.jar被傳遞到VM選項,並按照aop.xml文件是下META-INF

<!DOCTYPE aspectj PUBLIC 
     "-//AspectJ//DTD//EN" "http://www.eclipse.org/aspectj/dtd/aspectj.dtd"> 
<aspectj> 
    <weaver> 
     <!-- only weave classes in specific packages --> 
     <include within="*"/> 
    </weaver> 

    <aspects> 
     <!-- weave in just this aspect --> 
     <aspect name="com.Aspect"/> 
    </aspects> 
</aspectj> 

當我運行像測試:

applicationContext.getBean(A.class).sayHello("Jack"); 

結果似乎完美

Jack is knocking 
Hello Jack 

但是當我運行測試調用sayHello的內部本身

applicationContext.getBean(A.class).openDoorForJack(); 

沒有攔截髮生在所有

door opened 
Hello Jack 

之所以這樣,我用LTW是,我想方法呼叫使用「這個」或「超」也可被攔截,但似乎我沒有這樣做。 有人會幫我指出問題,有什麼我錯過了嗎?

----------------------------編輯----------------- ----------------
一些調試,我發現這裏也有我錯了
在現實生活中,
我哈瓦「A級」包下com.bussiness後
和 「類看點」 包下com.aspect
我又寫道aop.xml文件一樣遵循

<weaver> 
     <!-- only weave classes in specific packages --> 
     <include within="com.aspect.*"/> 
</weaver> 

這是不正確的,它應該是一個包含類需要進行編織,之後我把它改爲

<weaver> 
     <!-- com package and its sub package all get woven--> 
     <include within="com..*"/> 
</weaver> 

它最後工作

回答