我有經營業務類如下:問題調用內部本身
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>
它最後工作
是,這種方式也可以做的伎倆,認爲它會做一些副作用「的instanceof」,我會把它作爲B計劃 – revivn