Spring AOP 本質(5)

Spring AOP 本質(5)
 
Spring 的AOP核心技術仍是動態代理,Spring的代理實現方式有兩種,默認使用CGLIB,也能夠選擇使用JDK的代理,這一切對開發人員來講是透明的,能夠不關心這些。
 
可是,Spring實在是太強了,太吸引人了,以致於不得不研讀其底層的API實現。
 
Spring代理生成的過程仍是和JDK有必定區別的,通過研讀分析Spring AOP底層源碼,畫出了其原理圖。而且爲了對比JDK的動態代理的實現,也給出JDK動態代理原理圖。
 
 
下面,給出個JDK實現動態代理的例子,Spring的例子在AOP本質系列中比比皆是,故此再也不給出。
 
/**
* Created by IntelliJ IDEA.<br>
* <b>User</b>: leizhimin<br>
* <b>Date</b>: 2008-5-9 14:16:18<br>
* <b>Note</b>: 目標抽象接口
*/

public interface ITarget {
     public void doSomething();
}

/**
* Created by IntelliJ IDEA.<br>
* <b>User</b>: leizhimin<br>
* <b>Date</b>: 2008-5-9 14:17:03<br>
* <b>Note</b>: 目標類
*/

public class Target implements ITarget {

     public void doSomething() {
        System.out.println( ">>>正在調用Targer.doSomething()方法!");
    }
}

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

/**
* Created by IntelliJ IDEA.<br>
* <b>User</b>: leizhimin<br>
* <b>Date</b>: 2008-5-9 14:23:07<br>
* <b>Note</b>: 代理處理器實現
*/

public class MyInvocationHandler implements InvocationHandler {
     private Target target;

     public MyInvocationHandler(Object obj) {
        target = (Target) obj;
    }

     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println( ">>>代理處理器start...");
        Object result = method.invoke(target, args);
        System.out.println( ">>>代理處理器end...");
         return result;
    }
}


import java.lang.reflect.Proxy;

/**
* Created by IntelliJ IDEA.<br>
* <b>User</b>: leizhimin<br>
* <b>Date</b>: 2008-5-9 14:27:20<br>
* <b>Note</b>: 客戶端
*/

public class Test {
     public static void main(String args[]) {
         //建立目標對象
        Target target = new Target();
         //建立代理實例調用處理程序(至關於SpringAOP中切面)
        MyInvocationHandler myInvocationHandler = new MyInvocationHandler(target);
         //經過Proxy生成一個代理對象obj,obj能夠宣稱實現了目標對象所實現的接口ITarget
        ITarget proxyTarget = (ITarget) Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), myInvocationHandler);
         //從代理對象上調用目標對象的方法
        proxyTarget.doSomething();
    }
}
 
運行結果:
>>>代理處理器start...
>>>正在調用Targer.doSomething()方法!
>>>代理處理器end...

Process finished with exit code 0
 
 
呵呵,週末愉快!!
相關文章
相關標籤/搜索