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

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

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

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

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

這里僅僅舉個(gè)簡(jiǎn)單例子來(lái)說(shuō)明原理,不是完全針對(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)單說(shuō)說(shuō)MyBatis的實(shí)現(xiàn)原理,在該方法中,我們通過(guò)Method能夠獲取接口和方法名,接口的全名相當(dāng)于MyBatis XML中的namespace,方法名相當(dāng)于具體一個(gè)方法中的id。也就是說(shuō)通過(guò)動(dòng)態(tài)代理后,可以通過(guò)SqlSession來(lái)通過(guò)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);
  }
}

通過(guò)該工廠類可以生成任意接口的動(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)類方法的前置或者后置的特殊處理。

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

以上所述是小編給大家介紹的MyBatis接口的簡(jiǎn)單實(shí)現(xiàn)原理分析,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)歡迎給我留言,小編會(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)資料,文中通過(guò)示例代碼介紹的非常詳細(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及常用注解介紹,文中通過(guò)示例代碼介紹的非常詳細(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í)例詳解,文中通過(guò)示例代碼介紹的非常詳細(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)資料,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-02-02
  • Spring?Boot多數(shù)據(jù)源事務(wù)@DSTransactional的使用詳解

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

    本文主要介紹了Spring?Boot多數(shù)據(jù)源事務(wù)@DSTransactional的使用詳解,文中通過(guò)示例代碼介紹的非常詳細(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í)踐,文中通過(guò)示例代碼介紹的非常詳細(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è)步驟和組件,通過(guò)分層和優(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)鍵字詳析,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考一下,需要的小伙伴可以參考一下,希望對(duì)你的學(xué)習(xí)有所幫助
    2022-07-07
  • 淺談Java回收對(duì)象的標(biāo)記和對(duì)象的二次標(biāo)記過(guò)程

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

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

最新評(píng)論

察隅县| 和平区| 元氏县| 惠来县| 昌图县| 尖扎县| 宁都县| 宁德市| 垦利县| 上犹县| 马公市| 安阳县| 池州市| 陆河县| 鲁甸县| 盐山县| 罗田县| 晋城| 含山县| 凤翔县| 上饶县| 石棉县| 奎屯市| 桂平市| 南平市| 高唐县| 日喀则市| 巨鹿县| 五指山市| 沙雅县| 法库县| 康乐县| 玛多县| 东辽县| 大厂| 邢台县| 儋州市| 乾安县| 鹤壁市| 江门市| 渝中区|