JDK動態代理(AOP原理)

動態代理的簡單的實現:

//接口
interface Thing {
    void drive();
}

//被代理類
class Car implements Thing {
    @Override
    public void drive() {
        System.out.println("開始駕駛汽車!");
    }
}

//代理類
class MyProxy implements InvocationHandler {
    private Object object;

    public MyProxy(Object object) {
        this.object = object;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        dosomethingBefore();
        method.invoke(object,args);
        dosomethingAfter();
        return null;
    }

    private void dosomethingBefore() {
        System.out.println("上車");
    }

    private void dosomethingAfter() {
        System.out.println("下車");
    }
}

//請求類
public class Driver {
    public static void main(String[] args) {
        Car car = new Car();
        InvocationHandler handler = new MyProxy(car);
        Thing thing = (Thing) Proxy.newProxyInstance(handler.getClass().getClassLoader(),car.getClass().getInterfaces(),handler);
        thing.drive();
    }
}

Spring的AOP(面向切面編程)使用的就是jdk的動態代理(默認)。可以使得我們在不改變原有程序執行順序的基礎上,在程序運行過程中的某一個切面插入一些我們想要的操作(日誌,拋異常)。這在開發中操作數據庫的時候比較常見,例如在事務開始之前或者之後輸出一些東西。如果不使用AOP,則會使得程序變得非常冗餘且可擴展性很差。
AOP的底層其實就是使用了jdk的動態代理,即請求類(Driver)在請求被代理類(Car)的時候,並不是直接去調用被代理類(Car)裏面的方法,而是通過包裹在被代理類(Car)外面的一層代理類(MyProxy)去間接的調用。代理類(MyProxy)之中會有被代理類(Car,也就是Object)的對象,方便被代理類調用代理類的方法。通過這種設計,我們就可以在代理類(MyProxy)裏面調用被代理類(Car)方法的前後插入一些我們想要的在實際操作之前或者之後進行的操作。
而代理類之所以能調用被代理類之中的方法使用到了java中的反射。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章