国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Java通過動態代理實現一個簡單的攔截器操作

Java通過動態代理實現一個簡單的攔截器操作

2021-09-30 11:00李白csdn Java教程

這篇文章主要介紹了Java通過動態代理實現一個簡單的攔截器操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

一、代理

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

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

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

(1)先定義一個接口

?
1
2
3
public interface IUserDao {
    void save();
}

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

?
1
2
3
4
5
public class UserDaoImpl implements IUserDao {
    public void save() {
        System.out.println("--------已經保存數據---------");
    }
}

(3)定義代理對象

?
1
2
3
4
5
6
7
8
9
10
11
public class UserDaoProxy implements IUserDao {
 private IUserDao target;//將目標對象放到代理對象中
 public UserDaoProxy(IUserDao target){
  this.target = target;
  }
 public void save() {
     System.out.println("------開始事務------");
            target.save();
     System.out.println("-------提交事務------");
    }
}

測試一下:

?
1
2
3
4
5
6
7
public class Test {
public static void main(String[] args){
    IUserDao userDao = new UserDaoImpl();
    UserDaoProxy proxy = new UserDaoProxy(userDao);
    proxy.save();//通過代理對象調用save方法
    }
}

輸出結果為:

------開始事務------
--------已經保存數據---------

-------提交事務------

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

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

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

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

(3)創建動態代理類

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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("----開始事務2-----");
 
                    //執行目標對象方法
                    Object returnValue = method.invoke(target, args);
                    System.out.println("----提交事務2----");
 
                    return returnValue;
                }
            });
    }
}

測試一下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
public class Test {
    public static void main(String[] args) {
        //目標對象
        IUserDao target = new UserDao();
        System.out.println(target.getClass());
 
        //給目標對象創建代理對象
        IUserDao proxy = (IUserDao) new ProxyFactory(target).getProxyInstance();
        System.out.println("----proxy----:" + proxy.getClass());
        proxy.save();
        proxy.delete();
    }
}

輸出結果:

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
----開始事務2-----
-----保存完成------
----提交事務2----
----開始事務2-----
----刪除完成----

----提交事務2----

二、使用動態代理實現一個簡單的攔截器

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

1、定義一個接口

?
1
2
3
public interface BusinessFacade {
    void doSomething();
}

2、定義一個目標對象

?
1
2
3
4
5
public class BusinessClass implements BusinessFacade {
    public void doSomething() {
        System.out.println("在業務組件BusinessClass中調用doSomething方法");
    }
}

3、創建攔截器

?
1
2
3
4
5
6
7
8
9
public class InterceptorClass {
    public void before() {
        System.out.println("在InterceptorClass中調用方法:before()");
    }
 
    public void after() {
        System.out.println("在InterceptorClass中調用方法:after()");
    }
}

4、創建代理

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class DynamicProxyHandler {
    //聲明被代理對象
    private Object target;
    //創建攔截器
    InterceptorClass interceptor = new InterceptorClass();
    //動態生成一個代理對象,并綁定被代理類和代理處理器
    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;
                }
            });
    }
}

測試一下:

?
1
2
3
4
5
6
7
8
9
10
11
12
public class Test {
    public static void main(String[] args) {
        //創建動態代理工具
        DynamicProxyHandler proxyHandler = new DynamicProxyHandler();
        //創建業務組件
        BusinessFacade target = new BusinessClass();
        //獲取代理對象
        BusinessFacade proxy = (BusinessFacade) proxyHandler.getProxyInstance(target);
        //通過代理對象調用目標對象方法
        proxy.doSomething();
    }
}

輸出結果:

在InterceptorClass中調用方法:before()
在業務組件BusinessClass中調用doSomething方法
在InterceptorClass中調用方法:after()

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持服務器之家。

原文鏈接:https://blog.csdn.net/zjl_pcw/article/details/80505114

延伸 · 閱讀

精彩推薦
  • Java教程Java實現搶紅包功能

    Java實現搶紅包功能

    這篇文章主要為大家詳細介紹了Java實現搶紅包功能,采用多線程模擬多人同時搶紅包,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙...

    littleschemer13532021-05-16
  • Java教程小米推送Java代碼

    小米推送Java代碼

    今天小編就為大家分享一篇關于小米推送Java代碼,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧...

    富貴穩中求8032021-07-12
  • Java教程升級IDEA后Lombok不能使用的解決方法

    升級IDEA后Lombok不能使用的解決方法

    最近看到提示IDEA提示升級,尋思已經有好久沒有升過級了。升級完畢重啟之后,突然發現好多錯誤,本文就來介紹一下如何解決,感興趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    這篇文章主要介紹了Java使用SAX解析xml的示例,幫助大家更好的理解和學習使用Java,感興趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程Java8中Stream使用的一個注意事項

    Java8中Stream使用的一個注意事項

    最近在工作中發現了對于集合操作轉換的神器,java8新特性 stream,但在使用中遇到了一個非常重要的注意點,所以這篇文章主要給大家介紹了關于Java8中S...

    阿杜7472021-02-04
  • Java教程20個非常實用的Java程序代碼片段

    20個非常實用的Java程序代碼片段

    這篇文章主要為大家分享了20個非常實用的Java程序片段,對java開發項目有所幫助,感興趣的小伙伴們可以參考一下 ...

    lijiao5352020-04-06
  • Java教程xml與Java對象的轉換詳解

    xml與Java對象的轉換詳解

    這篇文章主要介紹了xml與Java對象的轉換詳解的相關資料,需要的朋友可以參考下...

    Java教程網2942020-09-17
  • Java教程Java BufferWriter寫文件寫不進去或缺失數據的解決

    Java BufferWriter寫文件寫不進去或缺失數據的解決

    這篇文章主要介紹了Java BufferWriter寫文件寫不進去或缺失數據的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望...

    spcoder14552021-10-18
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 成人福利视频 | 黄色精品网站 | 亚洲a网| 丁香五月网久久综合 | 国产美女在线观看 | 亚洲情在线 | 国产精品www | 国产精品久久久久久久久久东京 | 黄色网页免费看 | 95香蕉视频 | 一区视频 | 成人国产精品视频 | 中国黄色一级视频 | 操操你 | 成人午夜网站 | 午夜精品影院 | 在线观看国产一区 | 91精品国产综合久久福利软件 | 日韩在线免费播放 | 日韩欧美中文字幕在线视频 | 久久天天躁狠狠躁夜夜躁2014 | 精品视频一区二区三区 | 久久av网| 毛片免费观看 | 免费日韩成人 | 精品久久久久久久久久久 | 久久久久久一区 | 综合久久av | 91视频播放 | 黑人av | 国产91久久久久蜜臀青青天草二 | 久久男人 | av中文字幕在线播放 | 欧美精品一区二 | 97久久香蕉国产线看观看 | 精品视频在线观看 | 亚洲欧洲精品视频在线观看 | 日韩欧美在线一区二区 | 日韩视频免费在线播放 | 一区二区三区视频在线观看 | 国产精品亲子伦av一区二区三区 |