1. 程式人生 > >Java實現AOP切面(動態代理)

Java實現AOP切面(動態代理)

定義 row ack tcl getc java的反射機制 div implement reat

Java.lang.reflect包下,提供了實現代理機制的接口和類:

  1. public interface InvocationHandler

    InvocationHandler 是代理實例的調用處理程序 實現的接口。

  2. public class Proxy extends Object implements Serializable     

    Proxy 提供用於創建動態代理類和實例的靜態方法,它還是由這些方法創建的所有動態代理類的超類。

Java的動態代理依賴於接口,雖然在生成效率上較高,但是執行效率比較慢,而且Java的反射機制本身消耗的資源就比一般的調用來得更大一點。

Spring中給予客戶端自主選擇是使用Java的動態代理

還是使用CGLIB第三方代理實現,兩者各有特點。

簡單地說,Java的代理機制實現如下:

  1. 創建業務對象;
  2. 創建處理程序;
  3. 創建代理類;

示例:

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;

/**
 * Created by lay on 21/02/2018.
 */
public class ProxyDemo {

    public static void main(String[] args) {
        // 創建 被代理對象
        FooService fooService = new
FooServiceImpl(); // 實現 被代理對象 的處理程序 InvocationHandler handler = new MyInvocationHandler(fooService); // 返回 代理對象 FooService fooServiceProxy = (FooService) Proxy.newProxyInstance(fooService.getClass().getClassLoader(), fooService.getClass().getInterfaces(), handler);
// 代理對象調用方法 fooServiceProxy.getData(); } }
/**
 * 定義用戶接口
 * Created by lay on 21/02/2018.
 */
public interface FooService {
    void getData();
}
/**
 * 實現用戶接口
 * Created by lay on 21/02/2018.
 */
public class FooServiceImpl implements FooService {

    @Override
    public void getData() {
        System.out.println("調用了FooService實現類方法---getData...");
    }
}
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

/**
 * 實現JDK動態代理接口
 * Created by lay on 21/02/2018.
 */
public class MyInvocationHandler implements InvocationHandler {

    private Object target;

    public MyInvocationHandler(Object target) {
        this.target = target;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("執行前...");
        Object result =  method.invoke(target,args);
        System.out.println("執行後...");
        return result;
    }
}

Java實現AOP切面(動態代理)