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

MyBatis接口的簡(jiǎn)單實(shí)現(xiàn)原理分析

 更新時(shí)間:2017年07月09日 14:46:43   作者:蘸點(diǎn)醬  
這里僅僅舉個(gè)簡(jiǎn)單例子來(lái)說明原理,不是完全針對(duì)MyBatis的,這種思想我們也可以應(yīng)用在其他地方。地mybatis接口實(shí)現(xiàn)原理感興趣的朋友一起看看吧

用過MyBatis3的人可能會(huì)覺得為什么MyBatis的Mapper接口沒有實(shí)現(xiàn)類,但是可以直接用?

那是因?yàn)镸yBatis使用Java動(dòng)態(tài)代理實(shí)現(xiàn)的接口。

這里僅僅舉個(gè)簡(jiǎn)單例子來(lái)說明原理,不是完全針對(duì)MyBatis的,這種思想我們也可以應(yīng)用在其他地方。

定義一個(gè)接口

public interface MethodInterface { String helloWorld(); }

 實(shí)現(xiàn)動(dòng)態(tài)代理接口

public class MethodProxy<T> implements InvocationHandler {
  private Class<T> methodInterface;
  public MethodProxy(Class<T> methodInterface) {
    this.methodInterface = methodInterface;
  }
  @Override
  public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    System.out.println("=========================");
    System.out.println("方法名:" + method.getName());
    //針對(duì)不同的方法進(jìn)行不同的操作
    return null;
  }
}

這里針對(duì)invoke方法簡(jiǎn)單說說MyBatis的實(shí)現(xiàn)原理,在該方法中,我們通過Method能夠獲取接口和方法名,接口的全名相當(dāng)于MyBatis XML中的namespace,方法名相當(dāng)于具體一個(gè)方法中的id。也就是說通過動(dòng)態(tài)代理后,可以通過SqlSession來(lái)通過namespace.id方式來(lái)調(diào)用相應(yīng)的方法。使用接口更方便,但是是一種間接的方式。

動(dòng)態(tài)代理工廠類

public class MethodProxyFactory {
  public static <T> T newInstance(Class<T> methodInterface) {
    final MethodProxy<T> methodProxy = new MethodProxy<T>(methodInterface);
    return (T) Proxy.newProxyInstance(
        Thread.currentThread().getContextClassLoader(), 
        new Class[]{methodInterface}, 
        methodProxy);
  }
}

通過該工廠類可以生成任意接口的動(dòng)態(tài)代理類。

測(cè)試

MethodInterface method = MethodProxyFactory.newInstance(MethodInterface.class);
method.helloWorld();

總結(jié)

一般談到動(dòng)態(tài)代理我們通常的用法都是處理事務(wù)、日志或者記錄方法執(zhí)行效率等方面的應(yīng)用。都是對(duì)實(shí)現(xiàn)類方法的前置或者后置的特殊處理。

通過本文,其實(shí)可以看到另一種應(yīng)用方向,那就是不需要實(shí)現(xiàn)類,直接通過動(dòng)態(tài)代理執(zhí)行接口方法,MyBatis使用這種方式方便了我們調(diào)用方法,利用這種思路我們也許可以在別的方面做出一些更好的設(shè)計(jì)。

以上所述是小編給大家介紹的MyBatis接口的簡(jiǎn)單實(shí)現(xiàn)原理分析,希望對(duì)大家有所幫助,如果大家有任何疑問歡迎給我留言,小編會(huì)及時(shí)回復(fù)大家的!

相關(guān)文章

  • SpringBoot中的文件上傳和異常處理詳解

    SpringBoot中的文件上傳和異常處理詳解

    這篇文章主要介紹了SpringBoot中的文件上傳和異常處理詳解,對(duì)于機(jī)器客戶端,它將生成JSON響應(yīng),其中包含錯(cuò)誤,HTTP狀態(tài)和異常消息的詳細(xì)信息,對(duì)于瀏覽器客戶端,響應(yīng)一個(gè)"whitelabel"錯(cuò)誤視圖,以HTML格式呈現(xiàn)相同的數(shù)據(jù),需要的朋友可以參考下
    2023-09-09
  • SpringMVC處理數(shù)據(jù)輸出的實(shí)例代碼

    SpringMVC處理數(shù)據(jù)輸出的實(shí)例代碼

    這篇文章主要給大家介紹了關(guān)于SpringMVC處理數(shù)據(jù)輸出的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • Intellij IDEA 2017.3使用Lombok及常用注解介紹

    Intellij IDEA 2017.3使用Lombok及常用注解介紹

    這篇文章主要介紹了Intellij IDEA 2017.3使用Lombok及常用注解介紹,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • Java CAS底層實(shí)現(xiàn)原理實(shí)例詳解

    Java CAS底層實(shí)現(xiàn)原理實(shí)例詳解

    這篇文章主要介紹了Java CAS底層實(shí)現(xiàn)原理實(shí)例詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01
  • JDK17、JDK19、JDK1.8輕松切換(無(wú)坑版,小白也可以看懂!)

    JDK17、JDK19、JDK1.8輕松切換(無(wú)坑版,小白也可以看懂!)

    在做不同的java項(xiàng)目時(shí)候,因項(xiàng)目需要很可能來(lái)回切換jdk版本,下面這篇文章主要介紹了JDK17、JDK19、JDK1.8輕松切換的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-02-02
  • Spring?Boot多數(shù)據(jù)源事務(wù)@DSTransactional的使用詳解

    Spring?Boot多數(shù)據(jù)源事務(wù)@DSTransactional的使用詳解

    本文主要介紹了Spring?Boot多數(shù)據(jù)源事務(wù)@DSTransactional的使用詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • SpringBoot實(shí)現(xiàn)無(wú)限級(jí)評(píng)論回復(fù)的項(xiàng)目實(shí)踐

    SpringBoot實(shí)現(xiàn)無(wú)限級(jí)評(píng)論回復(fù)的項(xiàng)目實(shí)踐

    本文主要介紹了SpringBoot實(shí)現(xiàn)無(wú)限級(jí)評(píng)論回復(fù)的項(xiàng)目實(shí)踐,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • SpringBoot配置文件啟動(dòng)加載順序的方法步驟

    SpringBoot配置文件啟動(dòng)加載順序的方法步驟

    SpringBoot的啟動(dòng)加載順序涉及多個(gè)步驟和組件,通過分層和優(yōu)先級(jí)機(jī)制加載配置文件,確保在啟動(dòng)時(shí)正確配置應(yīng)用程序,本文就來(lái)介紹一下SpringBoot配置文件啟動(dòng)加載順序的方法步驟,感興趣的可以了解一下
    2024-11-11
  • Java幾個(gè)重要的關(guān)鍵字詳析

    Java幾個(gè)重要的關(guān)鍵字詳析

    這篇文章主要介紹了Java幾個(gè)重要的關(guān)鍵字詳析,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考一下,需要的小伙伴可以參考一下,希望對(duì)你的學(xué)習(xí)有所幫助
    2022-07-07
  • 淺談Java回收對(duì)象的標(biāo)記和對(duì)象的二次標(biāo)記過程

    淺談Java回收對(duì)象的標(biāo)記和對(duì)象的二次標(biāo)記過程

    這篇文章主要介紹了淺談Java回收對(duì)象的標(biāo)記和對(duì)象的二次標(biāo)記過程的相關(guān)內(nèi)容,小編覺得還是挺不錯(cuò)的,這里給大家分享一下,需要的朋友可以參考。
    2017-10-10

最新評(píng)論

温泉县| 竹北市| 特克斯县| 潍坊市| 万荣县| 武隆县| 红原县| 阿鲁科尔沁旗| 孟津县| 关岭| 密云县| 新宁县| 莲花县| 青川县| 洛宁县| 朔州市| 民勤县| 米泉市| 都江堰市| 西昌市| 濮阳市| 定州市| 嘉鱼县| 宜良县| 宝应县| 苗栗市| 沂源县| 康保县| 泰顺县| 安康市| 集安市| 郑州市| 资兴市| 寿宁县| 台前县| 邻水| 阳山县| 梓潼县| 娄底市| 鹰潭市| 仁寿县|