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

java設(shè)計優(yōu)化之代理模式

 更新時間:2016年03月06日 15:44:20   作者:ngulc  
這篇文章主要為大家詳細介紹了java設(shè)計優(yōu)化中的代理模式,感興趣的朋友可以參考一下

代理模式使用代理對象完成用戶的請求,屏蔽用戶對真實對象的訪問。

代理模式的用途很多,比如因為安全原因,需要屏蔽客戶端直接訪問真實對象;或者在遠程調(diào)用中,需要使用代理對象處理遠程方法中的技術(shù)細節(jié);或者為了提升系統(tǒng),對真是對象進行封裝,從而達到延遲加載的目的。

在系統(tǒng)啟動時,將消耗資源最多的方法使用代理模式分離,就可以加快系統(tǒng)的啟動速度,減少用戶的等待時間。在用戶真正在做查詢是,再由代理類加載真實的類,完成用戶請求。這就是使用代理模式達到延遲加載的目的。

1.靜態(tài)代理實現(xiàn):

主題接口:

public interface IDBQuery {
   String request();
 }

真實主題:

public class DBQuery implements IDBQuery {
  public DBQuery(){
    try {
      Thread.sleep(10000);
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
  public String request() {
    return "string request";
  }
}

代理類:

public class IDBQueryProxy implements IDBQuery {
  private DBQuery dbquery; 
  public String request() {
    if(dbquery==null)
      dbquery = new DBQuery();
    return dbquery.request();
  }
}

最后,主函數(shù):

public class ProxyText {
  public static void main(String[] args) {
    IDBQuery dbquery = new IDBQueryProxy();
    System.out.println(dbquery.request()); 
  }
}

靜態(tài)代理注意,代理類是真實類實現(xiàn)共同的接口,并且代理類引用真實類對象,將耗時操作放在代理類方法中實現(xiàn)。

動態(tài)代理:

動態(tài)代理即運行時,動態(tài)生成代理類。即:代理類的字節(jié)碼在運行時生成并載入當(dāng)前的classloader。與靜態(tài)代理相比,動態(tài)代理不需要為真實注意封裝一個形式上完全一樣的封裝類,假如主題接口很多,就要為每一個接口寫一個代理方法是很煩人的,如果接口有變動,真實類和代理類都需要變化,這樣不利于系統(tǒng)維護;其次,使用一些動態(tài)代理的生成方法甚至可以在運行是指定代理類的執(zhí)行邏輯,從而大大提高的系統(tǒng)的靈活性。

主題接口:

public interface IDBQuery {
   String request();
 }

jdk代理類:

public class JdbDbqueryHandler implements InvocationHandler{
  IDBQuery idbquery = null;
  @Override
  public Object invoke(Object proxy, Method method, Object[] args)
      throws Throwable {
    if(idbquery==null){
      idbquery = new DBQuery();
    }
    return idbquery.request();
  }
  public static IDBQuery createJdbProxy(){
    IDBQuery jdkProxy = (IDBQuery) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(),
        new Class[]{IDBQuery.class}, new JdbDbqueryHandler());
    System.out.println("JdbDbqueryHandler.createJdbProxy()");
    return jdkProxy;
  }

}

主函數(shù):

public class ProxyText {
  public static void main(String[] args) {
    IDBQuery idbQuery = JdbDbqueryHandler.createJdbProxy();
    System.out.println(idbQuery.request());
  }
}

另外,也可以使用CGLIB和javassist動態(tài)代理與jdk動態(tài)代理類似,但是jdk動態(tài)類的創(chuàng)建過程最快,因為這個內(nèi)置實現(xiàn)的difineclass()方法被定義為native實現(xiàn),故性能優(yōu)于其他。在代理類的函數(shù)調(diào)用上,JDK的動態(tài)代理不如CGLIB和javassist動態(tài)代理,而javassist動態(tài)代理性能質(zhì)量最差,甚至不如JDK的實現(xiàn)。在實際開發(fā)應(yīng)用中,代理類的方法調(diào)用頻率要遠遠高于代理類的實際生成頻率,故動態(tài)代理的方法調(diào)用性能應(yīng)該成為性能的關(guān)注點。JDK動態(tài)代理強制要求代理類和真是主題實現(xiàn)統(tǒng)一接口,CGLIB和javassist動態(tài)代理沒有這樣的要求。

在java中,動態(tài)代理的實現(xiàn)涉及到classloader的使用,以CGLIB為例,簡要描述下動態(tài)類的加載過程。使用CGLIB生成動態(tài)代理,首先需要生成Enhancer類的實例,并制定用于處理代理業(yè)務(wù)的回調(diào)類。在enhancer.create()方法中,會使用DefaultGeneratorStrategy.Generate()方法生成代理類的字節(jié)碼,并保存在byte數(shù)組中。接著調(diào)用reflectUtils.defineClass()方法,通過反射,調(diào)用ClassLoader.defineClass()方法,將字節(jié)碼裝載到classloader中,完成類的加載。最后,通過reflectUtils.newInstance()方法,通過反射生成動態(tài)類實例,并返回該實例。其他與該過程細節(jié)不同,但是生成邏輯相同。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助。

相關(guān)文章

  • java下載指定文件并返回給前端返回流文件的實現(xiàn)步驟

    java下載指定文件并返回給前端返回流文件的實現(xiàn)步驟

    在Java中我們可以根據(jù)文件地址返回一個文件流,以便對文件進行讀取、寫入等操作,下面這篇文章主要給大家介紹了關(guān)于java下載指定文件并返回給前端返回流文件的實現(xiàn)步驟,需要的朋友可以參考下
    2024-03-03
  • Spring Boot Actuator監(jiān)控端點小結(jié)

    Spring Boot Actuator監(jiān)控端點小結(jié)

    這篇文章主要介紹了Spring Boot Actuator監(jiān)控端點小結(jié),需要的朋友可以參考下
    2017-06-06
  • JavaTCP上傳文本文件代碼

    JavaTCP上傳文本文件代碼

    今天小編就為大家分享一篇關(guān)于JavaTCP上傳文本文件代碼,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-02-02
  • Java 實現(xiàn)FTP服務(wù)實例詳解

    Java 實現(xiàn)FTP服務(wù)實例詳解

    這篇文章主要介紹了Java 實現(xiàn)FTP服務(wù)實例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • 淺談Java 中的引用類型

    淺談Java 中的引用類型

    Java開發(fā)者肯定都很熟悉java中的4種引用類型,它們從強到弱分別是:強引用、軟引用、弱引用和虛引用,下面我們詳細看看這些引用類型
    2020-02-02
  • java實現(xiàn)猜字母游戲

    java實現(xiàn)猜字母游戲

    這篇文章主要為大家詳細介紹了java實現(xiàn)猜字母小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-03-03
  • Spring代理對象導(dǎo)致的獲取不到原生對象注解的解決

    Spring代理對象導(dǎo)致的獲取不到原生對象注解的解決

    本文主要介紹了Spring代理對象導(dǎo)致的獲取不到原生對象注解的解決,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • java 中Map詳解及實例代碼

    java 中Map詳解及實例代碼

    這篇文章主要介紹了java 中Map詳解及實例代碼的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • 一文帶你深入了解Java的自動拆裝箱

    一文帶你深入了解Java的自動拆裝箱

    Java推出了對于基本數(shù)據(jù)類型的對應(yīng)的對象,將基本數(shù)據(jù)類型轉(zhuǎn)換為對象就稱為裝箱,反之則是拆箱,本文主要為大家介紹了Java自動拆裝箱的原理與應(yīng)用,需要的可以參考下
    2023-11-11
  • 使用Swagger2實現(xiàn)自動生成RESTful?API文檔

    使用Swagger2實現(xiàn)自動生成RESTful?API文檔

    在開發(fā)?RESTful?API?的過程中,文檔是非常重要的一部分,可以幫助開發(fā)者了解?API?的功能和使用方法,本文將使用Swagger2?實現(xiàn)自動生成?RESTful?API?文檔,需要的可以參考一下
    2023-06-06

最新評論

彩票| 郧西县| 无棣县| 宜兰市| 饶平县| 根河市| 南靖县| 宜城市| 丹凤县| 沅江市| 玛沁县| 塘沽区| 南丰县| 南宫市| 益阳市| 柳江县| 来安县| 类乌齐县| 承德市| 南京市| 呼和浩特市| 甘肃省| 读书| 武穴市| 鹰潭市| 太保市| 清水河县| 文安县| 德庆县| 筠连县| 梅州市| 弥渡县| 哈密市| 东莞市| 松原市| 馆陶县| 绥宁县| 本溪| 台南市| 中宁县| 宜春市|