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

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

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

前言

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

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

前世今生

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

//服務(wù)員的接口
public interface Waiter {
  void serve();
}
//服務(wù)員的實現(xiàn)
public class WaiterImpl implements Waiter {
  @Override
  public void serve() {
    System.out.println("服務(wù)中...");
  }
}
//需要代理的對象處理器
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ù)重復(fù),可以考慮將三者抽出來,直接在攔截器的實現(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;
}

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

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

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

本文代碼

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

相關(guān)文章

  • SpringBoot進(jìn)行參數(shù)校驗的方法詳解

    SpringBoot進(jìn)行參數(shù)校驗的方法詳解

    在日常的接口開發(fā)中,為了防止非法參數(shù)對業(yè)務(wù)造成影響,經(jīng)常需要對接口的參數(shù)進(jìn)行校驗。本文通過示例詳細(xì)講解了SpringBoot如何進(jìn)行參數(shù)校驗的,感興趣的可以學(xué)習(xí)一下
    2022-04-04
  • 如何使用IntelliJ IDEA中的Live Templates自定義代碼模板

    如何使用IntelliJ IDEA中的Live Templates自定義代碼模板

    在IntelliJ IDEA中,通過使用LiveTemplates功能,可以實現(xiàn)快速編碼和自定義代碼模板,例如,輸入“main”可以自動補全主函數(shù)結(jié)構(gòu),“sout”可以補全輸出語句,用戶可以通過設(shè)置中的LiveTemplates選項查看和定義快捷模板,支持使用分組管理和參數(shù)化模板內(nèi)容,適應(yīng)復(fù)雜的編碼需求
    2024-11-11
  • java?9大性能優(yōu)化經(jīng)驗總結(jié)

    java?9大性能優(yōu)化經(jīng)驗總結(jié)

    這篇文章主要介紹了java?9大性能優(yōu)化經(jīng)驗總結(jié),包括:Java代碼優(yōu)化,數(shù)據(jù)庫優(yōu)化,分布式緩存,異步化,Web前段,搜索引擎優(yōu)化等需要的朋友可以參考下
    2023-02-02
  • 解析Spring中面向切面編程

    解析Spring中面向切面編程

    如果說 IoC 是 Spring 的核心,那么面向切面編程就是 Spring 最為重要的功能之一了,在數(shù)據(jù)庫事務(wù)中切面編程被廣泛使用
    2021-06-06
  • Java使用Scala實現(xiàn)尾遞歸優(yōu)化來解決爆棧問題

    Java使用Scala實現(xiàn)尾遞歸優(yōu)化來解決爆棧問題

    Scala?作為一種多范式的編程語言,結(jié)合了面向?qū)ο蠛秃瘮?shù)式編程的特性,在?Scala?中,尾遞歸?是通過編譯器優(yōu)化來防止棧溢出問題的,尾遞歸優(yōu)化是一種特殊的優(yōu)化方式,可以讓遞歸調(diào)用不使用新的棧幀,所以本文介紹了在Java項目中如何使用Scala實現(xiàn)尾遞歸優(yōu)化來解決爆棧問題
    2024-10-10
  • Spring Boot超詳細(xì)分析啟動流程

    Spring Boot超詳細(xì)分析啟動流程

    SpringBoot是Spring開源組織下的子項目,是Spring組件一站式解決方案,主要是簡化了使用Spring的難度,簡省了繁重的配置,提供了各種啟動器,開發(fā)者能快速上手,這篇文章主要給大家介紹了關(guān)于Spring Boot啟動流程知識點的相關(guān)資料,需要的朋友可以參考下
    2022-07-07
  • java編程常用技術(shù)(推薦)

    java編程常用技術(shù)(推薦)

    下面小編就為大家?guī)硪黄猨ava編程常用技術(shù)(推薦)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-06-06
  • Spring Bean生命周期之Bean的實例化詳解

    Spring Bean生命周期之Bean的實例化詳解

    這篇文章主要為大家詳細(xì)介紹了Spring Bean生命周期之Bean的實例化,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • RestClient?通過攔截器實現(xiàn)請求加密的示例

    RestClient?通過攔截器實現(xiàn)請求加密的示例

    本文介紹了如何通過攔截器實現(xiàn)請求加密,并通過RestClient優(yōu)化了加密過程,傳統(tǒng)的加密方法依賴對象轉(zhuǎn)換和序列化處理,容易導(dǎo)致加密不一致或難以調(diào)試的問題,通過引入攔截器,可以直接操作請求體,避免了不必要的轉(zhuǎn)換步驟,確保加密過程與請求體完全一致,感興趣的朋友一起看看吧
    2025-02-02
  • SpringBoot使用ShardingSphere-Proxy的實現(xiàn)示例

    SpringBoot使用ShardingSphere-Proxy的實現(xiàn)示例

    ShardingSphere-Proxy是一個獨立的數(shù)據(jù)庫代理層,可以與SpringBoot集成,本文介紹了SpringBoot使用ShardingSphere-Proxy的實現(xiàn)示例,具有一定的參考價值,感興趣的可以了解一下
    2025-02-02

最新評論

右玉县| 西乌| 大渡口区| 建始县| 来宾市| 航空| 和静县| 安新县| 衢州市| 孝义市| 阿尔山市| 象山县| 南澳县| 曲靖市| 乐至县| 平邑县| 甘泉县| 山西省| 德安县| 张北县| 衡阳市| 中方县| 白山市| 泸州市| 长海县| 易门县| 佛冈县| 宁远县| 福安市| 普陀区| 绵阳市| 宁安市| 修武县| 青田县| 广州市| 佛坪县| 汉川市| 张家川| 绥宁县| 大新县| 阿拉善盟|