1. 程式人生 > >JAVA的代理模式 靜態代理 JDK動態代理 cglib動態代理

JAVA的代理模式 靜態代理 JDK動態代理 cglib動態代理

 代理模式 
代理模式是常用的java設計模式,他的特徵是代理類與委託類有同樣的介面,代理類主要負責為委託類預處理訊息、過濾訊息、把訊息轉發給委託類,以及事後處理訊息等。代理類與委託類之間通常會存在關聯關係,一個代理類的物件與一個委託類的物件關聯,代理類的物件本身並不真正實現服務,而是通過呼叫委託類的物件的相關方法,來提供特定的服務。 
按照代理的建立時期,代理類可以分為兩種。 
靜態代理:由程式設計師建立或特定工具自動生成原始碼,再對其編譯。在程式執行前,代理類的.class檔案就已經存在了。 
動態代理:在程式執行時,運用反射機制動態建立而成。 

 

首先看一下靜態代理: 
1、Count.java 

  1. package net.battier.dao;  
  2.   
  3. /** 
  4.  * 定義一個賬戶介面 
  5.  *  
  6.  * @author Administrator 
  7.  *  
  8.  */  
  9. public
     interface Count {  
  10.     // 檢視賬戶方法  
  11.     public void queryCount();  
  12.   
  13.     // 修改賬戶方法  
  14.     public void updateCount();  
  15.   
  16. }  


2、CountImpl.java 

  1. package net.battier.dao.impl;  
  2.   
  3. import net.battier.dao.Count;  
  4.   
  5. /** 
  6.  * 委託類(包含業務邏輯) 
  7.  *  
  8.  * @author Administrator 
  9.  *  
  10.  */  
  11. public class CountImpl implements Count {  
  12.   
  13.     @Override  
  14.     public void queryCount() {  
  15.         System.out.println("檢視賬戶方法...");  
  16.   
  17.     }  
  18.   
  19.     @Override  
  20.     public void updateCount() {  
  21.         System.out.println("修改賬戶方法...");  
  22.   
  23.     }  
  24.   
  25. }  
  26.   
  27. 、CountProxy.java  
  28. package net.battier.dao.impl;  
  29.   
  30. import net.battier.dao.Count;  
  31.   
  32. /** 
  33.  * 這是一個代理類(增強CountImpl實現類) 
  34.  *  
  35.  * @author Administrator 
  36.  *  
  37.  */  
  38. public class CountProxy implements Count {  
  39.     private CountImpl countImpl;  
  40.   
  41.     /** 
  42.      * 覆蓋預設構造器 
  43.      *  
  44.      * @param countImpl 
  45.      */  
  46.     public CountProxy(CountImpl countImpl) {  
  47.         this.countImpl = countImpl;  
  48.     }  
  49.   
  50.     @Override  
  51.     public void queryCount() {  
  52.         System.out.println("事務處理之前");  
  53.         // 呼叫委託類的方法;  
  54.         countImpl.queryCount();  
  55.         System.out.println("事務處理之後");  
  56.     }  
  57.   
  58.     @Override  
  59.     public void updateCount() {  
  60.         System.out.println("事務處理之前");  
  61.         // 呼叫委託類的方法;  
  62.         countImpl.updateCount();  
  63.         System.out.println("事務處理之後");  
  64.   
  65.     }  
  66.   
  67. }  

 

3、TestCount.java 

  1. package net.battier.test;  
  2.   
  3. import net.battier.dao.impl.CountImpl;  
  4. import net.battier.dao.impl.CountProxy;  
  5.   
  6. /** 
  7.  *測試Count類 
  8.  *  
  9.  * @author Administrator 
  10.  *  
  11.  */  
  12. public class TestCount {  
  13.     public static void main(String[] args) {  
  14.         CountImpl countImpl = new CountImpl();  
  15.         CountProxy countProxy = new CountProxy(countImpl);  
  16.         countProxy.updateCount();  
  17.         countProxy.queryCount();  
  18.   
  19.     }  
  20. }  

 

觀察程式碼可以發現每一個代理類只能為一個介面服務,這樣一來程式開發中必然會產生過多的代理,而且,所有的代理操作除了呼叫的方法不一樣之外,其他的操作都一樣,則此時肯定是重複程式碼。解決這一問題最好的做法是可以通過一個代理類完成全部的代理功能,那麼此時就必須使用動態代理完成。 
再來看一下動態代理: 
JDK動態代理中包含一個類和一個介面: 
InvocationHandler介面: 
public interface InvocationHandler { 
public Object invoke(Object proxy,Method method,Object[] args) throws Throwable; 

引數說明: 
Object proxy:指被代理的物件。 
Method method:要呼叫的方法 
Object[] args:方法呼叫時所需要的引數 

可以將InvocationHandler介面的子類想象成一個代理的最終操作類,替換掉ProxySubject。 

Proxy類: 
Proxy類是專門完成代理的操作類,可以通過此類為一個或多個介面動態地生成實現類,此類提供瞭如下的操作方法: 
public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, 
InvocationHandler h) 
                               throws IllegalArgumentException 
引數說明: 
ClassLoader loader:類載入器 
Class<?>[] interfaces:得到全部的介面 
InvocationHandler h:得到InvocationHandler介面的子類例項 

Ps:類載入器 
在Proxy類中的newProxyInstance()方法中需要一個ClassLoader類的例項,ClassLoader實際上對應的是類載入器,在Java中主要有一下三種類載入器; 
Booststrap ClassLoader:此載入器採用C++編寫,一般開發中是看不到的; 
Extendsion ClassLoader:用來進行擴充套件類的載入,一般對應的是jre\lib\ext目錄中的類; 
AppClassLoader:(預設)載入classpath指定的類,是最常使用的是一種載入器。 

動態代理 
與靜態代理類對照的是動態代理類,動態代理類的位元組碼在程式執行時由Java反射機制動態生成,無需程式設計師手工編寫它的原始碼。動態代理類不僅簡化了程式設計工作,而且提高了軟體系統的可擴充套件性,因為Java 反射機制可以生成任意型別的動態代理類。java.lang.reflect 包中的Proxy類和InvocationHandler 介面提供了生成動態代理類的能力。 

動態代理示例: 
1、BookFacade.java 

  1. package net.battier.dao;  
  2.   
  3. public interface BookFacade {  
  4.     public void addBook();  
  5. }  

 

2、BookFacadeImpl.java 

  1. package net.battier.dao.impl;  
  2.   
  3. import net.battier.dao.BookFacade;  
  4.   
  5. public class BookFacadeImpl implements BookFacade {  
  6.   
  7.     @Override  
  8.     public void addBook() {  
  9.         System.out.println("增加圖書方法。。。");  
  10.     }  
  11.   
  12. }  
  13.   
  14. 、BookFacadeProxy.java  
  15.   
  16. package net.battier.proxy;  
  17.   
  18. import java.lang.reflect.InvocationHandler;  
  19. import java.lang.reflect.Method;  
  20. import java.lang.reflect.Proxy;  
  21.   
  22. /** 
  23.  * JDK動態代理代理類 
  24.  *  
  25.  * @author student 
  26.  *  
  27.  */  
  28. public class BookFacadeProxy implements InvocationHandler {  
  29.     private Object target;  
  30.     /** 
  31.      * 繫結委託物件並返回一個代理類 
  32.      * @param target 
  33. 相關推薦

    JAVA代理模式 靜態代理 JDK動態代理 cglib動態代理

     代理模式  代理模式是常用的java設計模式,他的特徵是代理類與委託類有同樣的介面,代理類主要負責為委託類預處理訊息、過濾訊息、把訊息轉發給委託類,以及事後處理訊息等。代理類與委託類之間通常會存在關聯關係,一個代理類的物件與一個委託類的物件關聯,代理類的物件本身並不真正實現服務,

    zbb20180930 代理模式 -靜態代理-jdk動態代理-cglib動態代理

    auth 動態代理 bsp 遠程 開始 pan 後處理 reflect tcl CGLIB與JDK動態代理區別 區別: java動態代理是利用反射機制生成一個實現代理接口的匿名類,在調用具體方法前調用InvokeHandler來處理。而cglib動態代理是利用asm開源包,

    代理模式靜態代理 動態代理(JDK代理cglib代理)

    面向物件的設計原則: 開閉原則:對於修改來說是關閉,對於擴充套件來說是開放的 單一職責原則: 一個專案的功能單一 一個模組的功能單一 一個介面/類的功能單一 一個方法的功能單一 一個變數的功能單一 代理設計模

    java 代理模式-靜態代理動態代理

    最近在研究SpringAOP,當然要學習AOP就要知道這麼健碩、強大的功能的背後究竟隱藏著怎樣不可告人的“祕密”?? 接下來就是查閱了許多資料詳細的研究了一下Java的代理模式,感覺還是非常非常重要的, 我們作為一個有“內涵的”程式設計師就更應該掌握啦!(本文需要細心、帶有審視的目光來甄別其中的內容) 在學

    代理模式-靜態代理動態代理

    應用 代碼 creat HR print tps 結果 inter OS 簡介 首先感謝沽泡學院 tom 老師 代理模式是一種結構型模式 代理模式就是代理對象幫被代理對象處理一些問題, 類似中介, 客戶只要結果, 中介怎麽搞是他的事兒, 他可能再處理過程中賺外快什麽的 代

    代理模式:利用JDK原生動態實現AOP

    我們 每次 利用 不可 原生 模型 ont 動態 訪問 http://www.cnblogs.com/qiuyong/p/6412870.html 1、概述   含義:控制對對象的訪問。   作用:詳細控制某個(某類)某對象的方法,在調用之前做前置處理,調用之後做後置處理,

    java設計模式--靜態代理

    1、定義通用介面 /** * 定義通用介面 * @author Administrator * @date 2018/7/22 */ public interface IBusiness { /** * 介面執行方法 */ vo

    代理模式二(JDK動態代理

    動態代理是指,程式在整個執行過程中根本就不存在目標類的代理類,目標物件的代理物件只是由代理生成工具(如代理工廠類) 在程式執行時由 JVM 根據反射等機制動態生成的。代理物件與目標物件的代理關係在程式執行時才確立。 下面直接給出案例 業務介面 package com.dem

    設計模式代理模式--靜態代理

    不斷學習是為了有一天可以蛻變成自己想成為的人! 1、代理模式介紹 2、代理模式的定義 3、代理模式使用場景 4、代理模式UML類圖 5、代理模式的示例 6、Android中代理模式的使用 7、代理模式

    分享知識-快樂自己:三種代理靜態JDKCGlib 代理

     1):代理模式(靜態代理)點我下載三種模式原始碼 代理模式是常用設計模式的一種,我們在軟體設計時常用的代理一般是指靜態代理,也就是在程式碼中顯式指定的代理。 靜態代理由 業務實現類、業務代理類 兩部分組成。 業務實現類 負責實現主要的業務方法,業務代理類負責對呼叫的業務方法作攔截、過濾、

    代理模式-靜態代理

    什麼是代理模式 通過代理控制物件的訪問,可以詳細訪問某個物件的方法,在這個方法呼叫處理,或呼叫後處理。既(AOP微實現)  ,AOP核心技術面向切面程式設計。 代理模式應用場景 SpringA

    設計模式代理模式(靜態代理)

    代理模式也被稱作委託模式。通俗點來說,就是有一個物件代理另一個物件的操作。 當無法或者不想直接訪問某個物件的存在困難時,可以通過一個代理物件來間接訪問。為了對呼叫者保持透明。需要讓委託物件和代理物件之間

    Java代理模式及應用(三)Cglib實現

    前一節所說的靜態代理和動態代理模式都是要求目標物件是實現一個介面的目標物件,但是有時候目標物件只是一個單獨的物件,並沒有實現任何的介面,這個時候就可以使用以目標物件子類的方式類實現代理,這種方法就叫做:Cglib代理 1.Cglib說明 Cglib代理,

    由service層介面有什麼用?引申到基於JDK原生和CGLIB動態代理實現spring事務管理的機制的思考

    問題1:Services層為什麼要用(Services介面 類 + Services介面實現 類)分開,這樣做有什麼好處? 總結: 1.程式設計介面化, 2.Spring的事物管理預設用的是java動態代理。 問題2:Spring事物管理實現的機制

    Spring代理模式——靜態代理

    代理模式:是一種設計模式,提供了對目標物件的另外訪問方式即通過代理訪問目標物件好處:可以在目標物件實現的基礎上,增加額外的功能操作。擴充套件目標物件的功能實現方式:1、靜態代理儲存資料到資料庫Dao直接儲存想額外擴充套件:新增事務要求:代理物件要實現與目標物件相同的介面優點:

    初探Java設計模式4:JDK中的設計模式

    細節 領取 chain water for 微信 form 模型 學習經驗 JDK中設計模式本文主要是歸納了JDK中所包含的設計模式,包括作用和其設計類圖。首先來個總結,具體的某個模式可以一個一個慢慢寫,希望能對研究JDK和設計模式有所幫助。一、設計模式是什麽(1)反復出現

    java代理模式學習,靜態代理JDK動態代理CGLIB動態代理

                    java代理模式學習,靜態代理,JDK動態代理,CGLIB動態代理   一、理解代理 1、代理,Proxy 。意思是:本來該你做的事兒,別人代替你去做。 比如說:即將

    Java靜態代理動態代理模式的實現

    loader 兩個 如何 圖片 ide 相同 catch 規範 png 前言: 在現實生活中,考慮以下的場景:小王打算要去租房,他相中了一個房子,準備去找房東洽談相關事宜。但是房東他很忙,平時上班沒時間,總沒有時間見面,他也沒辦法。後來,房東想了一個辦法,他找到了一個

    java項目實戰】代理模式(Proxy Pattern),靜態代理 VS 動態代理

    自己 text 好的 trace use 代理 分類 plproxy this 這篇博文,我們主要以類圖和代碼的形式來對照學習一下靜態代理和動態代理。重點解析各自的優缺點。 定義 代理模式(Proxy Pattern)是對象的結構型模式,代理模

    java 代理模式靜態代理動態代理Cglib代理) 轉載

    cas 代理人 缺點 intercept 必須 lan itcast 技術 有時 Java的三種代理模式 1.代理模式 代理(Proxy)是一種設計模式,提供了對目標對象另外的訪問方式;即通過代理對象訪問目標對象.這樣做的好處是:可以在目標對象實現的基礎上,增強額外的功能操