免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
Spring的兩種動態(tài)代理:Jdk和Cglib 的區(qū)別和實現(xiàn)

一、原理區(qū)別:

java動態(tài)代理是利用反射機制生成一個實現(xiàn)代理接口的匿名類,在調用具體方法前調用InvokeHandler來處理。

而cglib動態(tài)代理是利用asm開源包,對代理對象類的class文件加載進來,通過修改其字節(jié)碼生成子類來處理。

1、如果目標對象實現(xiàn)了接口,默認情況下會采用JDK的動態(tài)代理實現(xiàn)AOP 
2、如果目標對象實現(xiàn)了接口,可以強制使用CGLIB實現(xiàn)AOP 

3、如果目標對象沒有實現(xiàn)了接口,必須采用CGLIB庫,spring會自動在JDK動態(tài)代理和CGLIB之間轉換

如何強制使用CGLIB實現(xiàn)AOP?
 (1)添加CGLIB庫,SPRING_HOME/cglib/*.jar
 (2)在spring配置文件中加入<aop:aspectj-autoproxy proxy-target-class="true"/>

JDK動態(tài)代理和CGLIB字節(jié)碼生成的區(qū)別?
 (1)JDK動態(tài)代理只能對實現(xiàn)了接口的類生成代理,而不能針對類
 (2)CGLIB是針對類實現(xiàn)代理,主要是對指定的類生成一個子類,覆蓋其中的方法
   因為是繼承,所以該類或方法最好不要聲明成final 

二、代碼實現(xiàn)

用戶管理接口

package com.lf.shejimoshi.proxy.entity;//用戶管理接口public interface UserManager {    //新增用戶抽象方法    void addUser(String userName,String password);    //刪除用戶抽象方法    void delUser(String userName);    }

用戶管理接口實現(xiàn)類

package com.lf.shejimoshi.proxy.entity;//用戶管理實現(xiàn)類,實現(xiàn)用戶管理接口public class UserManagerImpl implements UserManager{    //重寫新增用戶方法    @Override    public void addUser(String userName, String password) {        System.out.println("調用了新增的方法!");        System.out.println("傳入參數為 userName: "+userName+" password: "+password);    }    //重寫刪除用戶方法    @Override    public void delUser(String userName) {        System.out.println("調用了刪除的方法!");        System.out.println("傳入參數為 userName: "+userName);    }    }

JDK動態(tài)代理

package com.lf.shejimoshi.proxy.jdk;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;import com.lf.shejimoshi.proxy.entity.UserManager;import com.lf.shejimoshi.proxy.entity.UserManagerImpl;//JDK動態(tài)代理實現(xiàn)InvocationHandler接口public class JdkProxy implements InvocationHandler {    private Object target ;//需要代理的目標對象        @Override    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {        System.out.println("JDK動態(tài)代理,監(jiān)聽開始!");        Object result = method.invoke(target, args);        System.out.println("JDK動態(tài)代理,監(jiān)聽結束!");        return result;    }    //定義獲取代理對象方法    private Object getJDKProxy(Object targetObject){        //為目標對象target賦值        this.target = targetObject;        //JDK動態(tài)代理只能針對實現(xiàn)了接口的類進行代理,newProxyInstance 函數所需參數就可看出        return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(), targetObject.getClass().getInterfaces(), this);    }        public static void main(String[] args) {        JdkProxy jdkProxy = new JdkProxy();//實例化JDKProxy對象        UserManager user = (UserManager) jdkProxy.getJDKProxy(new UserManagerImpl());//獲取代理對象        user.addUser("admin", "123123");//執(zhí)行新增方法    }    }

JDK動態(tài)代理運行結果

Cglib動態(tài)代理(需要導入兩個jar包,asm-5.2.jar,cglib-3.2.5.jar。版本自行選擇)

package com.lf.shejimoshi.proxy.cglib;import java.lang.reflect.Method;import com.lf.shejimoshi.proxy.entity.UserManager;import com.lf.shejimoshi.proxy.entity.UserManagerImpl;import net.sf.cglib.proxy.Enhancer;import net.sf.cglib.proxy.MethodInterceptor;import net.sf.cglib.proxy.MethodProxy;//Cglib動態(tài)代理,實現(xiàn)MethodInterceptor接口public class CglibProxy implements MethodInterceptor {    private Object target;//需要代理的目標對象        //重寫攔截方法    @Override    public Object intercept(Object obj, Method method, Object[] arr, MethodProxy proxy) throws Throwable {        System.out.println("Cglib動態(tài)代理,監(jiān)聽開始!");        Object invoke = method.invoke(target, arr);//方法執(zhí)行,參數:target 目標對象 arr參數數組        System.out.println("Cglib動態(tài)代理,監(jiān)聽結束!");        return invoke;    }    //定義獲取代理對象方法    public Object getCglibProxy(Object objectTarget){        //為目標對象target賦值        this.target = objectTarget;        Enhancer enhancer = new Enhancer();        //設置父類,因為Cglib是針對指定的類生成一個子類,所以需要指定父類        enhancer.setSuperclass(objectTarget.getClass());        enhancer.setCallback(this);// 設置回調         Object result = enhancer.create();//創(chuàng)建并返回代理對象        return result;    }        public static void main(String[] args) {        CglibProxy cglib = new CglibProxy();//實例化CglibProxy對象        UserManager user =  (UserManager) cglib.getCglibProxy(new UserManagerImpl());//獲取代理對象        user.delUser("admin");//執(zhí)行刪除方法    }    }

Cglib動態(tài)代理運行結果

本站僅提供存儲服務,所有內容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權內容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
面試官:說說你對Spring AOP 的實現(xiàn)機制的理解!
java jdk與cglib動態(tài)代理模式的認識和實現(xiàn)
jdk動態(tài)代理使用實例詳解
動態(tài)代理模式——JDK動態(tài)代理
求求你,下次面試別再問我什么是 Spring AOP 和代理了!
Java動態(tài)代理的兩種實現(xiàn)方法
更多類似文章 >>
生活服務
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服