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

輕松掌握Java代理模式

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

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

1、靜態(tài)代理

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

public interface IUserDao {
  void save();
} 

1.2被代理的類,目標對象 

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


1.3代理對象 

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

1.4測試類 

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

2、動態(tài)代理

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

2.2目標對象也是相同的。

2.3只是在代理對象上有所不同 

public class ProxyFactory {
  // 維護一個目標對象
  private Object target;
  public ProxyFactory(Object target){
    this.target = target;
  }
  // 給目標對象,生成代理對象 
  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í)行目標對象方法
            Object returnValue = method.invoke(target, args);  
            System.out.println("提交事務(wù)");
            return returnValue;
          }
        });
  }
}

2.4測試類 

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

3、cglib代理

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

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

public class ProxyFactory implements MethodInterceptor{
  // 維護目標對象
  private Object target;
  public ProxyFactory(Object target){
    this.target = target;
  }
  // 給目標對象創(chuàng)建代理對象
  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)建子類(代理對象)
    return en.create();
  }
  @Override
  public Object intercept(Object obj, Method method, Object[] args,
      MethodProxy proxy) throws Throwable {
    System.out.println("開始事務(wù).....");
    // 執(zhí)行目標對象的方法
    Object returnValue = method.invoke(target, args);
    System.out.println("提交事務(wù).....");
    return returnValue;
  }
}

3.3測試類 

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

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

相關(guān)文章

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

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

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

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

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

    學會CompletableFuture輕松駕馭異步編程

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

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

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

    談?wù)勎覍pring Bean 生命周期的理解

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

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

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

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

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

    解決Shiro 處理ajax請求攔截登錄超時的問題

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

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

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

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

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

最新評論