Java實現AOP切面(動態代理)
阿新 • • 發佈:2018-02-21
定義 row ack tcl getc java的反射機制 div implement reat 還是使用CGLIB第三方代理實現,兩者各有特點。
Java.lang.reflect包下,提供了實現代理機制的接口和類:
-
public interface InvocationHandler
InvocationHandler
是代理實例的調用處理程序 實現的接口。 -
public class Proxy extends Object implements Serializable
Proxy
提供用於創建動態代理類和實例的靜態方法,它還是由這些方法創建的所有動態代理類的超類。
Java的動態代理依賴於接口,雖然在生成效率上較高,但是執行效率比較慢,而且Java的反射機制本身消耗的資源就比一般的調用來得更大一點。
Spring中給予客戶端自主選擇是使用Java的動態代理
簡單地說,Java的代理機制實現如下:
- 創建業務對象;
- 創建處理程序;
- 創建代理類;
示例:
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 = newFooServiceImpl(); // 實現 被代理對象 的處理程序 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切面(動態代理)