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

輕松掌握J(rèn)ava代理模式

 更新時(shí)間:2016年09月19日 10:58:25   作者:趙卓  
這篇文章主要幫助大家輕松掌握J(rèn)ava代理模式,什么是靜態(tài)代理?感興趣的小伙伴們可以參考一下

和大家一起聊一聊java代理模式

1、靜態(tài)代理

1.1靜態(tài)代理的代理類和和被代理的類都要維護(hù)一個(gè)共同的接口。 

public interface IUserDao {
  void save();
} 

1.2被代理的類,目標(biāo)對(duì)象 

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


1.3代理對(duì)象 

public class UserDaoProxy implements IUserDao{
  // 接收保存目標(biāo)對(duì)象
  private IUserDao target;
  public UserDaoProxy(IUserDao target) {
    this.target = target;
  }
  @Override
  public void save() {
    System.out.println("開始事務(wù)...");
    target.save();       // 執(zhí)行目標(biāo)對(duì)象的方法
    System.out.println("提交事務(wù)...");
  }
}

1.4測(cè)試類 

public class App {
  public static void main(String[] args) {
    // 目標(biāo)對(duì)象
    IUserDao target = new UserDao();
    // 代理
    IUserDao proxy = new UserDaoProxy(target);
    proxy.save(); // 執(zhí)行的是,代理的方法
  }
}

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

2.1同樣的,動(dòng)態(tài)代理也需要完成一個(gè)接口。(同上)

2.2目標(biāo)對(duì)象也是相同的。

2.3只是在代理對(duì)象上有所不同 

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

2.4測(cè)試類 

public class App {
  public static void main(String[] args) {
    // 目標(biāo)對(duì)象
    IUserDao target = new UserDao();
    System.out.println(target.getClass());
    // 給目標(biāo)對(duì)象,創(chuàng)建代理對(duì)象
    IUserDao proxy = (IUserDao) new ProxyFactory(target).getProxyInstance();
    System.out.println(proxy.getClass());
    // 執(zhí)行方法  【代理對(duì)象】
    proxy.save();
  }
}

3、cglib代理

3.1cglib代理不需要完成接口,只需要寫被代理的類和代理類即可,此處被代理類同1.2,所以不再編寫。

3.2代理類有所不同,用到cglib代理模式需要引用spring的核心框架包。 

public class ProxyFactory implements MethodInterceptor{
  // 維護(hù)目標(biāo)對(duì)象
  private Object target;
  public ProxyFactory(Object target){
    this.target = target;
  }
  // 給目標(biāo)對(duì)象創(chuàng)建代理對(duì)象
  public Object getProxyInstance(){
    //1. 工具類
    Enhancer en = new Enhancer();
    //2. 設(shè)置父類
    en.setSuperclass(target.getClass());
    //3. 設(shè)置回調(diào)函數(shù)
    en.setCallback(this);
    //4. 創(chuàng)建子類(代理對(duì)象)
    return en.create();
  }
  @Override
  public Object intercept(Object obj, Method method, Object[] args,
      MethodProxy proxy) throws Throwable {
    System.out.println("開始事務(wù).....");
    // 執(zhí)行目標(biāo)對(duì)象的方法
    Object returnValue = method.invoke(target, args);
    System.out.println("提交事務(wù).....");
    return returnValue;
  }
}

3.3測(cè)試類 

public class App {
  public static void main(String[] args) {
    // 目標(biāo)對(duì)象
    UserDao target = new UserDao();
    System.out.println(target.getClass());
    // 代理對(duì)象
    UserDao proxy = (UserDao) new ProxyFactory(target).getProxyInstance();
    System.out.println(proxy.getClass());
    // 執(zhí)行代理對(duì)象的方法
    proxy.save();
  }
}

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

相關(guān)文章

  • java多線程中執(zhí)行多個(gè)程序的實(shí)例分析

    java多線程中執(zhí)行多個(gè)程序的實(shí)例分析

    在本篇文章里小編給大家整理的是一篇關(guān)于java多線程中執(zhí)行多個(gè)程序的實(shí)例分析內(nèi)容,有需要的朋友們可以學(xué)習(xí)參考下。
    2021-02-02
  • MyBatis?if?test?判斷字符串相等不生效問題

    MyBatis?if?test?判斷字符串相等不生效問題

    這篇文章主要介紹了MyBatis?if?test?判斷字符串相等不生效問題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • 學(xué)會(huì)CompletableFuture輕松駕馭異步編程

    學(xué)會(huì)CompletableFuture輕松駕馭異步編程

    這篇文章主要為大家介紹了CompletableFuture輕松駕馭異步編程教程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • java Random.nextInt()方法的具體使用

    java Random.nextInt()方法的具體使用

    這篇文章主要介紹了java Random.nextInt()方法的具體使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • 談?wù)勎覍?duì)Spring Bean 生命周期的理解

    談?wù)勎覍?duì)Spring Bean 生命周期的理解

    Spring Bean 的生命周期在整個(gè) Spring 中占有很重要的位置,掌握這些可以加深對(duì) Spring 的理解。這篇文章主要介紹了Spring Bean 生命周期,需要的朋友可以參考下
    2018-03-03
  • idea推送項(xiàng)目到gitee中的創(chuàng)建方法

    idea推送項(xiàng)目到gitee中的創(chuàng)建方法

    這篇文章主要介紹了idea推送項(xiàng)目到gitee中的創(chuàng)建方法,本文通過圖文實(shí)例相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-08-08
  • Mybatis基于MapperScan注解的動(dòng)態(tài)代理加載機(jī)制詳解

    Mybatis基于MapperScan注解的動(dòng)態(tài)代理加載機(jī)制詳解

    這篇文章主要介紹了Mybatis基于MapperScan注解的動(dòng)態(tài)代理加載機(jī)制,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2023-01-01
  • 解決Shiro 處理ajax請(qǐng)求攔截登錄超時(shí)的問題

    解決Shiro 處理ajax請(qǐng)求攔截登錄超時(shí)的問題

    這篇文章主要介紹了解決Shiro 處理ajax請(qǐng)求攔截登錄超時(shí)的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Java后端返回PDF預(yù)覽給前端的實(shí)現(xiàn)

    Java后端返回PDF預(yù)覽給前端的實(shí)現(xiàn)

    前端要預(yù)覽服務(wù)器PDF 可直接將要blob流返回給前端,即可用瀏覽器自帶pdf預(yù)覽功能打開,本文就來介紹一下如何實(shí)現(xiàn),感興趣的可以了解一下
    2023-09-09
  • IDEA創(chuàng)建Maven項(xiàng)目一直顯示正在加載的問題及解決

    IDEA創(chuàng)建Maven項(xiàng)目一直顯示正在加載的問題及解決

    這篇文章主要介紹了IDEA創(chuàng)建Maven項(xiàng)目一直顯示正在加載的問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12

最新評(píng)論