最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java通過動態(tài)代理實現(xiàn)一個簡單的攔截器操作

 更新時間:2021年07月09日 11:09:03   作者:李白csdn  
這篇文章主要介紹了Java通過動態(tài)代理實現(xiàn)一個簡單的攔截器操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

一、代理

在使用動態(tài)代理實現(xiàn)攔截器之前我們先簡單了解一下什么Java的代理。

代理,顧名思義,就是不直接操作被代理(下面都用目標對象稱呼,聽起來舒服一些)對象,而是通過一個代理對象去間接的使用目標對象中的方法。代理分為兩種模式,一種是靜態(tài)代理,一種是動態(tài)代理。接下來先寫一個靜態(tài)代理的例子。

無論是靜態(tài)代理還是動態(tài)代理,目標對象(target)都要實現(xiàn)一個接口(interface),注意,如果使用cglib提供的代理,則不必實現(xiàn)接口,而是通過子類去實現(xiàn),暫不討論該種方式。

(1)先定義一個接口

public interface IUserDao {
    void save();
}

(2)定義目標對象(target)

public class UserDaoImpl implements IUserDao {
    public void save() {
        System.out.println("--------已經(jīng)保存數(shù)據(jù)---------");
    }
}

(3)定義代理對象

public class UserDaoProxy implements IUserDao {
 private IUserDao target;//將目標對象放到代理對象中
 public UserDaoProxy(IUserDao target){
  this.target = target;
  }
 public void save() {
     System.out.println("------開始事務(wù)------");
            target.save();
     System.out.println("-------提交事務(wù)------");
    }
}

測試一下:

public class Test {
public static void main(String[] args){
    IUserDao userDao = new UserDaoImpl();
    UserDaoProxy proxy = new UserDaoProxy(userDao);
    proxy.save();//通過代理對象調(diào)用save方法
    }
}

輸出結(jié)果為:

------開始事務(wù)------
--------已經(jīng)保存數(shù)據(jù)---------

-------提交事務(wù)------

這種方式有一個問題,就是代理對象必須也要實現(xiàn)被代理對象所實現(xiàn)的同一個接口,這就出現(xiàn)了嚴重的耦合。所以,下面使用一種改進的方式,即動態(tài)代理(jdk代理)。

動態(tài)代理方式也需要目標對象(target)實現(xiàn)一個接口

(1)定義一個接口(IUserDao)

(2)定義一個目標對象類(UserDaoImpl)

(3)創(chuàng)建動態(tài)代理類

public class ProxyFactory {
    //維護一個目標對象
    private Object target; 
    public ProxyFactory(Object target) {
        this.target = target;
    }
 
    //給目標對象生成代理對象
    public Object getProxyInstance() {
        System.out.println("----target class---" + target.getClass());
        System.out.println("----target interfaces---" +
            target.getClass().getInterfaces());
 
        return Proxy.newProxyInstance(target.getClass().getClassLoader(),
            target.getClass().getInterfaces(),
            new InvocationHandler() {
                public Object invoke(Object proxy, Method method, Object[] args)
                    throws Throwable {
                    System.out.println("----開始事務(wù)2-----");
 
                    //執(zhí)行目標對象方法
                    Object returnValue = method.invoke(target, args);
                    System.out.println("----提交事務(wù)2----");
 
                    return returnValue;
                }
            });
    }
}

測試一下:

public class Test {
    public static void main(String[] args) {
        //目標對象
        IUserDao target = new UserDao();
        System.out.println(target.getClass());
 
        //給目標對象創(chuàng)建代理對象
        IUserDao proxy = (IUserDao) new ProxyFactory(target).getProxyInstance();
        System.out.println("----proxy----:" + proxy.getClass());
        proxy.save();
        proxy.delete();
    }
}

輸出結(jié)果:

class com.jd.pattern.proxy.dynamicProxy.UserDao
----target class---class com.jd.pattern.proxy.dynamicProxy.UserDao
----target interfaces---[Ljava.lang.Class;@1fb3ebeb
----proxy----:class com.sun.proxy.$Proxy0
----開始事務(wù)2-----
-----保存完成------
----提交事務(wù)2----
----開始事務(wù)2-----
----刪除完成----

----提交事務(wù)2----

二、使用動態(tài)代理實現(xiàn)一個簡單的攔截器

既然是采用動態(tài)代理的方式,那么肯定會有 接口、目標類、代理類,再加一個攔截器

1、定義一個接口

public interface BusinessFacade {
    void doSomething();
}

2、定義一個目標對象

public class BusinessClass implements BusinessFacade {
    public void doSomething() {
        System.out.println("在業(yè)務(wù)組件BusinessClass中調(diào)用doSomething方法");
    }
}

3、創(chuàng)建攔截器

public class InterceptorClass {
    public void before() {
        System.out.println("在InterceptorClass中調(diào)用方法:before()");
    }
 
    public void after() {
        System.out.println("在InterceptorClass中調(diào)用方法:after()");
    }
}

4、創(chuàng)建代理

public class DynamicProxyHandler {
    //聲明被代理對象
    private Object target;
    //創(chuàng)建攔截器
    InterceptorClass interceptor = new InterceptorClass();
    //動態(tài)生成一個代理對象,并綁定被代理類和代理處理器
    public Object getProxyInstance(final Object target) {
        this.target = target;
        return Proxy.newProxyInstance(target.getClass().getClassLoader(),
            target.getClass().getInterfaces(),
            new InvocationHandler() {
                public Object invoke(Object proxy, Method method, Object[] args)
                    throws Throwable {
                    interceptor.before();
                    Object result = method.invoke(target, args);
                    interceptor.after();
                    return result;
                }
            });
    }
}

測試一下:

public class Test {
    public static void main(String[] args) {
        //創(chuàng)建動態(tài)代理工具
        DynamicProxyHandler proxyHandler = new DynamicProxyHandler();
        //創(chuàng)建業(yè)務(wù)組件
        BusinessFacade target = new BusinessClass();
        //獲取代理對象
        BusinessFacade proxy = (BusinessFacade) proxyHandler.getProxyInstance(target);
        //通過代理對象調(diào)用目標對象方法
        proxy.doSomething();
    }
}

輸出結(jié)果:

在InterceptorClass中調(diào)用方法:before()
在業(yè)務(wù)組件BusinessClass中調(diào)用doSomething方法
在InterceptorClass中調(diào)用方法:after()

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • idea中將單個java類導出為jar包文件的方法

    idea中將單個java類導出為jar包文件的方法

    這篇文章主要給大家介紹了關(guān)于idea中將單個java類導出為jar包文件的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-09-09
  • java實現(xiàn)超市管理系統(tǒng)

    java實現(xiàn)超市管理系統(tǒng)

    這篇文章主要為大家詳細介紹了java實現(xiàn)超市管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • SpringBoot?內(nèi)置工具類的使用

    SpringBoot?內(nèi)置工具類的使用

    本文主要介紹了SpringBoot?內(nèi)置工具類的使用,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • SpringBoot 圖形驗證碼的生成和校驗

    SpringBoot 圖形驗證碼的生成和校驗

    隨著系統(tǒng)和業(yè)務(wù)的不停升級,前后端代碼放在一起的項目越來越臃腫,已經(jīng)無法快速迭代和職責區(qū)分了,于是紛紛投入了前后端分離的懷抱,發(fā)現(xiàn)代碼和職責分離以后,開發(fā)效率越來越高了,但是以前的驗證碼登錄方案就要更改了。本文來看一下SpringBoot 圖形驗證碼的生成和校驗
    2021-05-05
  • Java String的intern用法解析

    Java String的intern用法解析

    這篇文章主要介紹了Java String的intern用法解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-10-10
  • java 實現(xiàn)讀取txt文本數(shù)據(jù)并以數(shù)組形式一行一行取值

    java 實現(xiàn)讀取txt文本數(shù)據(jù)并以數(shù)組形式一行一行取值

    今天小編就為大家分享一篇java 實現(xiàn)讀取txt文本數(shù)據(jù)并以數(shù)組形式一行一行取值,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • Spring boot跨域設(shè)置實例詳解

    Spring boot跨域設(shè)置實例詳解

    這篇文章主要介紹了Spring boot跨域設(shè)置實例詳解,簡單介紹了跨域的定義,原因,使用場景及解決方案,具有一定參考價值,需要的朋友可以了解下。
    2017-11-11
  • java中幾種http請求方式示例詳解

    java中幾種http請求方式示例詳解

    在日常工作和學習中有很多地方都需要發(fā)送HTTP請求,下面這篇文章主要給大家介紹了關(guān)于java中幾種http請求方式的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2023-11-11
  • Netty4之如何實現(xiàn)HTTP請求、響應(yīng)

    Netty4之如何實現(xiàn)HTTP請求、響應(yīng)

    這篇文章主要介紹了Netty4之如何實現(xiàn)HTTP請求、響應(yīng)問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • java網(wǎng)絡(luò)之基于UDP的聊天程序示例解析

    java網(wǎng)絡(luò)之基于UDP的聊天程序示例解析

    這篇文章主要介紹了java網(wǎng)絡(luò)之基于UDP的聊天程序示例解析,文中通過步驟及示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-08-08

最新評論

安新县| 南皮县| 林西县| 佛山市| 四川省| 竹山县| 南雄市| 乐安县| 锡林郭勒盟| 周口市| 大理市| 克东县| 珲春市| 香格里拉县| 年辖:市辖区| 枞阳县| 青海省| 宁城县| 黎平县| 新干县| 迭部县| 仙居县| 八宿县| 芮城县| 桐柏县| 阿荣旗| 丰顺县| 镇原县| 淮安市| 隆回县| 镇巴县| 尉氏县| 独山县| 正宁县| 阳泉市| 眉山市| 温泉县| 静海县| 建宁县| 深圳市| 大新县|