關於動態代理
---恢復內容開始---
動態代理是相對於靜態代理來說的,相比於後者,前者能夠增強代碼的復用性,可以處理一類對象。
動態代理兩種分別是JDK動態代理和Cglib動態動態代理:
前者要求代理類對象和委托類實現相同的接口,否則不能生成代理對象,而且指定方法較為麻煩。代碼如下:
public class Proxy{
//獲取代理對象的靜態方法
public static Object getProxy(final Object target , final TranactionManager tx){
//利用target參數獲取類加載器,真實對象類上的接口和指定接口,創建代理對象
Object proxy = Proxy.NewInstance(target.getClass().getClassLoader , target.getClass().getInterfaces() , new InvocationHandler( ){
//當與方法關聯的代理實例上調用方法時,將在調用處理程序上調用此方法
[email protected]
public Object invoke(Object proxy,Method method , Object[] args) throws throwable{
tx.begin();
method.invoke(target,args);
tx.commit();
}
});
return proxy;
}
}
後者不管有無接口都可以實現代理對象,生成的代理對象時目標對象的子類
public class DynamicProxy {
//獲取代理對象
public static Object getProxy(final Object target,final TranactionManager tx){
//增強器 底層操作的是二進制碼
Enhancer enhancer = new Enhancer();
//設置接口
enhancer.setInterfaces(target.getClass().getInterfaces());
//設置父類
enhancer.setSuperclass(target.getClass());
//創建代理對象
return enhancer.create();
//設置回調 代理對象調用方法時,此方法進行攔截,進入到此方法中
//當與方法關聯的代理實例上調用方法時,將在調用處理程序上調用此方法
enhancer.setCallback(new MethodInterceptor() {
@Override
public Object intercept(Object proxy, Method method, Object[] args,
MethodProxy methodProxy) throws Throwable {
tx.begin();
//調用真實對象的方法
Object result = method.invoke(target, args);
tx.commit();
return result;
}
});
}
}
---恢復內容結束---
關於動態代理