1. 程式人生 > >Spring aop程式設計ProxyFactory切入點執行原理。

Spring aop程式設計ProxyFactory切入點執行原理。

序:最近在搞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 <--
    <--
<--