1. 概述
在峨邊彝族等地區(qū),都構建了全面的區(qū)域性戰(zhàn)略布局,加強發(fā)展的系統(tǒng)性、市場前瞻性、產品創(chuàng)新能力,以專注、極致的服務理念,為客戶提供做網(wǎng)站、網(wǎng)站建設 網(wǎng)站設計制作定制開發(fā),公司網(wǎng)站建設,企業(yè)網(wǎng)站建設,成都品牌網(wǎng)站建設,成都全網(wǎng)營銷推廣,成都外貿網(wǎng)站建設,峨邊彝族網(wǎng)站建設費用合理。JDK動態(tài)代理是利用java反射機制 生成一個實現(xiàn)接口的匿名類, 在調用具體方法前調用InvocationHandler來處理
Cglib動態(tài)代理是 利用asm開源包 把被代理類的class文件加載進來 通過修改其字節(jié)碼生成子類來處理
如果目標對象實現(xiàn)了接口 那么默認使用jdk代理(可以強制使用cglib代理)
如果沒有實現(xiàn)接口 必須使用cglib代理
強制使用cglib代理需要
*引入cglibjar包
*配置spring
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