1. 概述

JDK動(dòng)態(tài)代理是利用java反射機(jī)制 生成一個(gè)實(shí)現(xiàn)接口的匿名類, 在調(diào)用具體方法前調(diào)用InvocationHandler來處理
Cglib動(dòng)態(tài)代理是 利用asm開源包 把被代理類的class文件加載進(jìn)來 通過修改其字節(jié)碼生成子類來處理
如果目標(biāo)對(duì)象實(shí)現(xiàn)了接口 那么默認(rèn)使用jdk代理(可以強(qiáng)制使用cglib代理)
如果沒有實(shí)現(xiàn)接口 必須使用cglib代理
強(qiáng)制使用cglib代理需要
*引入cglibjar包
*配置spring <aop:aspectj-autoproxy proxy-target-class="true"/>
cglib因?yàn)槭莿?dòng)態(tài)生成被代理類的子類 并覆蓋被代理類的方法 來實(shí)現(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("增強(qiáng)前 ... Cglib");
Object invoke = method.invoke(service, arg2);
System.out.println("增強(qiáng)后 ... Cglib");
return invoke;
}});
UserService userService = (UserService) hancer.create();
userService.sayHello();
}
}
//需要引入cglib-2.2.jar 和org.objectweb.asm-3.3.1.jar
//輸出
//增強(qiáng)前 ... Cglib
//this userService works....
//增強(qiáng)后 ... Cglib
網(wǎng)站標(biāo)題:springcglib與jdk動(dòng)態(tài)代理-創(chuàng)新互聯(lián)
路徑分享:http://www.chinadenli.net/article28/dhoecp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供建站公司、軟件開發(fā)、定制網(wǎng)站、關(guān)鍵詞優(yōu)化、企業(yè)建站、App開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容