Spring aop程式設計ProxyFactory切入點執行原理。
阿新 • • 發佈:2019-01-06
序:最近在搞Spring MVC程式設計,對Spring,做了個小實驗,拿出來記錄一下。
先上程式碼:
public class LoggerExecute implements MethodInterceptor {
@Override
public Object invoke(MethodInvocation methodInvocation) throws Throwable {
before();
methodInvocation.proceed();
System.out.println("日誌關閉:"+this.toString());
return null;
}
//前置通知
private void before(){
System.out.println("日誌啟動:"+this.toString());
}
}
public class BExecute implements MethodInterceptor {
@Override
public Object invoke(MethodInvocation methodInvocation) throws Throwable {
System.out.println("日誌啟動:"+this.toString());
System.out.println("日誌關閉" );;
return null;
}
}
public class Main {
public static void main(String[] args) throws Exception {
testAop();
}
private static void testAop(){
Target target=new Target();
ProxyFactory factory=new ProxyFactory();
factory.addAdvice(new LoggerExecute());
factory.addAdvice(new BExecute());
factory.addAdvice(new LoggerExecute());
factory.setTarget(new Target());
Target proxy=(Target)factory.getProxy();
proxy.execute("AOP的簡單實現");
}
}
輸出:
日誌啟動:aop.LoggerExecute@6ad5c04e
日誌啟動:aop.BExecute@6833ce2c
日誌關閉
日誌關閉:aop.LoggerExecute@6ad5c04e
結論:
對於ProxyFactory切入點的執行原理,他的處理方式是這樣子的,按順序對每個advice進行執行,在advice執行到methodInvocation.proceed();語句時,通過這條語句會跳轉到下一個advice的入口,相當於暫停這個方法呼叫,然後呼叫下一個advice。迴圈直到最後一個advice,在最後一個advice執行methodInvocation.proceed();時呼叫目標方法,然後回溯執行程式,相當於如下架構:
-->
-->
-->
-->
target
<--
<--
<--
<--
如果在某個advice中沒有methodInvocation.proceed();這條語句,則不會再往下呼叫advice直接回溯產生如下架構:
此時不會呼叫target,直接在沒有發現這條語句的advice處開始回溯。
-->
--> (null)
| x -->
| -->
| target
| <--
| x <--
<--
<--