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

Mybatis中攔截器的簡單實現(xiàn)方法

 更新時間:2019年08月07日 10:39:33   作者:斯是陋室,惟吾德馨  
這篇文章主要給大家介紹了關于Mybatis中攔截器的簡單實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Mybatis具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧

前言

需求驅動學習,最近一周組長讓我在業(yè)務模塊里加日志,經(jīng)過與導師以及組長討論決定用攔截器記錄日志。周五下班前已經(jīng)發(fā)了提測郵件。

雖然我知道 MyBatis 有這東西,但是沒在實際情況中用過,心里有點虛2333……所以才有了此文的理解。

前世今生

它的本質就是 JDK 的動態(tài)代理。首先先來復習一下動態(tài)代理我貼了一段最常見的 JDK 動態(tài)代理的代碼

//服務員的接口
public interface Waiter {
  void serve();
}
//服務員的實現(xiàn)
public class WaiterImpl implements Waiter {
  @Override
  public void serve() {
    System.out.println("服務中...");
  }
}
//需要代理的對象處理器
class WaitInvocationHandler implements InvocationHandler {
  private Waiter waiter;

  public WaitInvocationHandler(Waiter waiter1) {
    waiter = waiter1;
  }

  @Override
  public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    System.out.println("你好");
    Object invoke = method.invoke(waiter, args);
    System.out.println("再見");
    return invoke;
  }
}
public class App {
  //普通的實現(xiàn)
  @Test
  public void fun() {
    Waiter waiter = new WaiterImpl();
    waiter.serve();
  }

  @Test
  public void fun1() {
    Waiter a = new WaiterImpl();
    ClassLoader classLoader = getClass().getClassLoader();
    Class[] classes = {Waiter.class};
    //生成代理對象
    Waiter waiterproxy = (Waiter) Proxy.newProxyInstance(classLoader, classes, new WaitInvocationHandler(a));
    waiterproxy.serve();
  }
}

攔截器

V1

我現(xiàn)在要在函數(shù)執(zhí)行前后記錄日志操作,考慮需要在代理方法那里定義個攔截器的接口,如下代碼所示

//攔截器 V1 版本
public interface MyInterceptorV1 {
  void interceptor();
}
//代理對象變成這個
public class TargetProxyV1 implements InvocationHandler {

  private Target target;

  private MyInterceptorV1 myInterceptor;

  public TargetProxyV1(Target target, MyInterceptorV1 myInterceptor) {
    this.target = target;
    this.myInterceptor = myInterceptor;
  }

  @Override
  public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    myInterceptor.interceptor();
    return method.invoke(target, args);
  }
}

這是最簡單的版本,但是我們很多時候需要攔截參數(shù)等根據(jù)參數(shù)判斷攔不攔截等,代碼更新如下

public interface MyInterceptorV1 {
  void interceptor(Method method, Object[] args);
}

@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
  myInterceptor.interceptor(method, args);
  return method.invoke(target, args);
}

V2

似乎上面的方案很完美

廢話肯定不完美,不然怎么會有這段

沒錯,第二段代碼并不是很優(yōu)雅,有方法參數(shù)重復,可以考慮將三者抽出來,直接在攔截器的實現(xiàn)里寫上 method.invoke(target, args); ,如下代碼所示

@Getter
@Setter
@AllArgsConstructor
public class MyInvocation {
  private Object target;
  private Method method;
  private Object[] args;

  public Object proceed() throws InvocationTargetException, IllegalAccessException {
    return method.invoke(target, args);
  }
}
//沒錯這就是 V2 版本
public interface MyInterceptorV2 {
  Object interceptor(MyInvocation invocation) throws Throwable;
}

總結
Mybatis 的攔截器就是像我上面這么寫的,

名字也跟我取得一樣, 只是它更加復雜,能夠通過注解區(qū)分攔截 update 操作和 query
等操作。

既完成了任務又鞏固了原來的知識,這種感覺很棒,最關鍵的是還有錢拿……

本文代碼

好了,以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。

相關文章

  • Java解決代碼重復的三個絕招分享

    Java解決代碼重復的三個絕招分享

    本文將從業(yè)務代碼中最常見的三個需求展開,聊聊如何使用?Java?中的一些高級特性、設計模式,以及一些工具消除重復代碼,才能既優(yōu)雅又高端
    2022-07-07
  • java反射耗時測試案例解析

    java反射耗時測試案例解析

    這篇文章主要介紹了java反射耗時測試案例解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-10-10
  • ElasticSearch之索引模板滾動索引實現(xiàn)詳解

    ElasticSearch之索引模板滾動索引實現(xiàn)詳解

    這篇文章主要為大家介紹了ElasticSearch之索引模板滾動索引實現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-04-04
  • 兩張動圖--帶你搞懂TCP的三次握手與四次揮手

    兩張動圖--帶你搞懂TCP的三次握手與四次揮手

    TCP是一種傳輸控制協(xié)議,是面向連接的、可靠的、基于字節(jié)流之間的傳輸層通信協(xié)議,由IETF的RFC 793定義。在簡化的計算機網(wǎng)絡OSI模型中,TCP完成第四層傳輸層所指定的功能
    2021-06-06
  • SpringBoot Tomcat啟動實例代碼詳解

    SpringBoot Tomcat啟動實例代碼詳解

    這篇文章主要介紹了SpringBoot Tomcat啟動實例代碼詳解,需要的朋友可以參考下
    2017-09-09
  • 別在Java代碼里亂打日志了,這才是正確的打日志姿勢

    別在Java代碼里亂打日志了,這才是正確的打日志姿勢

    這篇文章主要介紹了別在Java代碼里亂打日志了,這才是正確的打日志姿勢,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-06-06
  • Java模擬UDP通信示例代碼

    Java模擬UDP通信示例代碼

    這篇文章主要介紹了Java模擬UDP通信,文中示例代碼非常詳細,供大家參考和學習,感興趣的朋友可以了解下
    2020-06-06
  • Java 中FastJson的基本使用

    Java 中FastJson的基本使用

    fastjson 是一個性能很好的 Java 語言實現(xiàn)的 JSON 解析器和生成器,來自阿里巴巴的工程師開發(fā)。下面通過本文給大家介紹Java 中FastJson的基本使用,需要的朋友參考下吧
    2017-11-11
  • spring boot+ redis 接口訪問頻率限制的實現(xiàn)

    spring boot+ redis 接口訪問頻率限制的實現(xiàn)

    這篇文章主要介紹了spring boot+ redis 接口訪問頻率限制的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-01-01
  • spring中時間格式化的兩種方法示例講解

    spring中時間格式化的兩種方法示例講解

    這篇文章主要介紹了spring中時間格式化的兩種方法,方法一自己格式化,方法二通過配置,結合實例代碼講解的非常詳細,文中補充介紹了Spring項目中時間格式化的方法,需要的朋友可以參考下
    2023-08-08

最新評論