欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

代理模式使用代理對(duì)象完成用戶的請(qǐng)求,屏蔽用戶對(duì)真實(shí)對(duì)象的訪問。

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

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

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

主題接口:

public interface IDBQuery {
   String request();
 }

真實(shí)主題:

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)代理注意,代理類是真實(shí)類實(shí)現(xiàn)共同的接口,并且代理類引用真實(shí)類對(duì)象,將耗時(shí)操作放在代理類方法中實(shí)現(xiàn)。

動(dòng)態(tài)代理:

動(dòng)態(tài)代理即運(yùn)行時(shí),動(dòng)態(tài)生成代理類。即:代理類的字節(jié)碼在運(yùn)行時(shí)生成并載入當(dāng)前的classloader。與靜態(tài)代理相比,動(dòng)態(tài)代理不需要為真實(shí)注意封裝一個(gè)形式上完全一樣的封裝類,假如主題接口很多,就要為每一個(gè)接口寫一個(gè)代理方法是很煩人的,如果接口有變動(dòng),真實(shí)類和代理類都需要變化,這樣不利于系統(tǒng)維護(hù);其次,使用一些動(dòng)態(tài)代理的生成方法甚至可以在運(yùn)行是指定代理類的執(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動(dòng)態(tài)代理與jdk動(dòng)態(tài)代理類似,但是jdk動(dòng)態(tài)類的創(chuàng)建過程最快,因?yàn)檫@個(gè)內(nèi)置實(shí)現(xiàn)的difineclass()方法被定義為native實(shí)現(xiàn),故性能優(yōu)于其他。在代理類的函數(shù)調(diào)用上,JDK的動(dòng)態(tài)代理不如CGLIB和javassist動(dòng)態(tài)代理,而javassist動(dòng)態(tài)代理性能質(zhì)量最差,甚至不如JDK的實(shí)現(xiàn)。在實(shí)際開發(fā)應(yīng)用中,代理類的方法調(diào)用頻率要遠(yuǎn)遠(yuǎn)高于代理類的實(shí)際生成頻率,故動(dòng)態(tài)代理的方法調(diào)用性能應(yīng)該成為性能的關(guān)注點(diǎn)。JDK動(dòng)態(tài)代理強(qiáng)制要求代理類和真是主題實(shí)現(xiàn)統(tǒng)一接口,CGLIB和javassist動(dòng)態(tài)代理沒有這樣的要求。

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

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

相關(guān)文章

  • Java實(shí)現(xiàn)驗(yàn)證碼驗(yàn)證功能

    Java實(shí)現(xiàn)驗(yàn)證碼驗(yàn)證功能

    Java如何實(shí)現(xiàn)驗(yàn)證碼驗(yàn)證功能呢?日常生活中,驗(yàn)證碼隨處可見,他可以在一定程度上保護(hù)賬號(hào)安全,那么他是怎么實(shí)現(xiàn)的呢?今天通過本文給大家實(shí)例詳解,需要的朋友參考下
    2017-02-02
  • Spring-Bean創(chuàng)建對(duì)象的步驟方式詳解

    Spring-Bean創(chuàng)建對(duì)象的步驟方式詳解

    在本篇文章里小編給大家分享的是關(guān)于Spring-Bean創(chuàng)建對(duì)象的步驟方式詳解內(nèi)容,有興趣的朋友們跟著學(xué)習(xí)下。
    2020-02-02
  • Java Servlet簡(jiǎn)單實(shí)例分享(文件上傳下載demo)

    Java Servlet簡(jiǎn)單實(shí)例分享(文件上傳下載demo)

    下面小編就為大家?guī)硪黄狫ava Servlet簡(jiǎn)單實(shí)例分享(文件上傳下載demo)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-05-05
  • 詳解java封裝返回結(jié)果與RestControllerAdvice注解

    詳解java封裝返回結(jié)果與RestControllerAdvice注解

    這篇文章主要為大家介紹了java封裝返回結(jié)果與RestControllerAdvice注解實(shí)例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • 通過Java壓縮JavaScript代碼實(shí)例分享

    通過Java壓縮JavaScript代碼實(shí)例分享

    這篇文章主要介紹了通過Java壓縮JavaScript代碼實(shí)例分享,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-12-12
  • Mybatis配置文件之動(dòng)態(tài)SQL配置備忘錄

    Mybatis配置文件之動(dòng)態(tài)SQL配置備忘錄

    這篇文章主要介紹了Mybatis配置文件之動(dòng)態(tài)SQL配置備忘錄的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • 什么是Java多線程,如何實(shí)現(xiàn)

    什么是Java多線程,如何實(shí)現(xiàn)

    這篇文章主要給大家介紹了關(guān)于實(shí)現(xiàn)Java多線程的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧吧
    2021-11-11
  • SpringBoot整合Netty實(shí)現(xiàn)WebSocket的示例代碼

    SpringBoot整合Netty實(shí)現(xiàn)WebSocket的示例代碼

    本文主要介紹了SpringBoot整合Netty實(shí)現(xiàn)WebSocket的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • SpringBoot + minio實(shí)現(xiàn)分片上傳、秒傳、續(xù)傳功能

    SpringBoot + minio實(shí)現(xiàn)分片上傳、秒傳、續(xù)傳功能

    MinIO是一個(gè)基于Go實(shí)現(xiàn)的高性能、兼容S3協(xié)議的對(duì)象存儲(chǔ),使用MinIO構(gòu)建用于機(jī)器學(xué)習(xí),分析和應(yīng)用程序數(shù)據(jù)工作負(fù)載的高性能基礎(chǔ)架構(gòu),這篇文章主要介紹了SpringBoot + minio實(shí)現(xiàn)分片上傳、秒傳、續(xù)傳,需要的朋友可以參考下
    2023-06-06
  • Java循環(huán)終止的實(shí)現(xiàn)方式總結(jié)

    Java循環(huán)終止的實(shí)現(xiàn)方式總結(jié)

    循環(huán)是一種重復(fù)執(zhí)行一段代碼的結(jié)構(gòu),Java提供了四種主要的循環(huán)結(jié)構(gòu),本文主要來和大家介紹一下Java循環(huán)終止的實(shí)現(xiàn)方式,有需要的小伙伴可以參考一下
    2023-10-10

最新評(píng)論