1. 概述

JDK動態(tài)代理是利用java反射機制 生成一個實現(xiàn)接口的匿名類, 在調(diào)用具體方法前調(diào)用InvocationHandler來處理
Cglib動態(tài)代理是 利用asm開源包 把被代理類的class文件加載進來 通過修改其字節(jié)碼生成子類來處理
如果目標對象實現(xiàn)了接口 那么默認使用jdk代理(可以強制使用cglib代理)
如果沒有實現(xiàn)接口 必須使用cglib代理
強制使用cglib代理需要
*引入cglibjar包
*配置spring <aop:aspectj-autoproxy proxy-target-class="true"/>
cglib因為是動態(tài)生成被代理類的子類 并覆蓋被代理類的方法 來實現(xiàn)的 所以 被代理方法不要使用final修飾
2. 代碼示例
2.1 cglib代理類
package com.rocky.spring;
import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
public class CglibProxy {
public static void main(String[] args) {
final UserService service = new UserService();
Enhancer hancer = new Enhancer();
hancer.setSuperclass(service.getClass());
hancer.setCallback(new MethodInterceptor(){
@Override
public Object intercept(Object proxy, Method method, Object[] arg2,
MethodProxy arg3) throws Throwable {
System.out.println("增強前 ... Cglib");
Object invoke = method.invoke(service, arg2);
System.out.println("增強后 ... Cglib");
return invoke;
}});
UserService userService = (UserService) hancer.create();
userService.sayHello();
}
}
//需要引入cglib-2.2.jar 和org.objectweb.asm-3.3.1.jar
//輸出
//增強前 ... Cglib
//this userService works....
//增強后 ... Cglib
網(wǎng)站標題:springcglib與jdk動態(tài)代理-創(chuàng)新互聯(lián)
路徑分享:http://chinadenli.net/article28/dhoecp.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供建站公司、軟件開發(fā)、定制網(wǎng)站、關鍵詞優(yōu)化、企業(yè)建站、App開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)