国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Mybatis中alices的實現(xiàn)

魏明 / 2136人閱讀

摘要:使用方式別名的實現(xiàn)方式有三種指定一個類路徑,并指定這個類的別名第二種方式,指定類名和別名指定一個包名,會自動掃描包下可以使用別名的類源碼分析的加載過程代碼入口的加載方式,首先進入標(biāo)簽后,先判斷子節(jié)點。

mybatis 別名
1.別名的作用
別名是一個指代的名稱,當(dāng)類的全限定名過長的時候,我們可以用一個簡短的名稱指代它,這個名稱可以再全文指代。
2.使用方式
別名的實現(xiàn)方式有三種
(1).指定一個類路徑,并指定這個類的別名


    

(2).第二種方式,指定類名和別名


    

(3).指定一個包名,mybatis會自動掃描包下可以使用別名的類


    

3.源碼分析
的加載過程
代碼入口:typeAliasesElement(root.evalNode("typeAliases"));

typeAlias的加載方式,首先進入標(biāo)簽后,先判斷子節(jié)點。
(1).如果子節(jié)點是,
調(diào)用configuration.getTypeAliasRegistry().registerAliases(typeAliasPackage)方法
(2).如果子節(jié)點是,判斷type的內(nèi)容
如果type為null,調(diào)用typeAliasRegistry.registerAlias(clazz);
如果type不為null,調(diào)用typeAliasRegistry.registerAlias(alias, clazz)

private void typeAliasesElement(XNode parent) {
    if (parent != null) { 
        //獲取所有的子節(jié)點
      for (XNode child : parent.getChildren()) {
        if ("package".equals(child.getName())) {
          //加載方式
          String typeAliasPackage = child.getStringAttribute("name");
          configuration.getTypeAliasRegistry().registerAliases(typeAliasPackage);
        } else {
          // 獲取 alias 和 type 屬性值,alias可為空
          String alias = child.getStringAttribute("alias");
          String type = child.getStringAttribute("type");
          try {
            // 加載 type 對應(yīng)的類型
            Class clazz = Resources.classForName(type);
            if (alias == null) {
            //加載方式
              typeAliasRegistry.registerAlias(clazz);
            } else {
            //加載方式
              typeAliasRegistry.registerAlias(alias, clazz);
            }
          } catch (ClassNotFoundException e) {
            throw new BuilderException("Error registering typeAlias for "" + alias + "". Cause: " + e, e);
          }
        }
      }
    }
    }

分析別名的加載,三種情況
首先分析指定類路徑,并指定這個類的別名的加載方式。原因是另外兩種方法其實最后還是調(diào)用了這個方式

//alias != null
//
typeAliasRegistry.registerAlias(alias, clazz);

public void registerAlias(String alias, Class value) {
if (alias == null) throw new TypeException("The parameter alias cannot be null");
//將Alias的值大寫轉(zhuǎn)換為小寫
String key = alias.toLowerCase(Locale.ENGLISH); // issue #748
//TYPE_ALIASES的定義:  
//private final Map> TYPE_ALIASES = new HashMap>();
//如果TYPE_ALIASES中存在,拋出異常,否則,放入到TYPE_ALIASES中
if (TYPE_ALIASES.containsKey(key) && TYPE_ALIASES.get(key) != null && !TYPE_ALIASES.get(key).equals(value)) {
  throw new TypeException("The alias "" + alias + "" is already mapped to the value "" + TYPE_ALIASES.get(key).getName() + "".");
}
TYPE_ALIASES.put(key, value);

}

//alias == null
//
typeAliasRegistry.registerAlias(clazz);
//處理思路是通過type獲取類名,然后調(diào)用registerAlias(alias, type)方法

public void registerAlias(Class type) {
//獲取全路徑類名的簡稱
String alias = type.getSimpleName();
Alias aliasAnnotation = type.getAnnotation(Alias.class);
if (aliasAnnotation != null) {
  // 從注解中取出別名
  alias = aliasAnnotation.value();
} 
//調(diào)用registerAlias方法
registerAlias(alias, type);

}

//
String typeAliasPackage = child.getStringAttribute("name");
configuration.getTypeAliasRegistry().registerAliases(typeAliasPackage);

public void registerAliases(String packageName, Class superType){
    
ResolverUtil> resolverUtil = new ResolverUtil>();
//查找此路徑下所有的類
resolverUtil.find(new ResolverUtil.IsA(superType), packageName);
//獲取查找結(jié)果
Set>> typeSet = resolverUtil.getClasses();
for(Class type : typeSet){
  // Ignore inner classes and interfaces (including package-info.java)
  // Skip also inner classes. See issue #6
  // 忽略接口,內(nèi)部類,匿名類
  if (!type.isAnonymousClass() && !type.isInterface() && !type.isMemberClass()) {
    // 為類型注冊別名
    registerAlias(type);
  }
}

}

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/75920.html

相關(guān)文章

  • Python之路--python基礎(chǔ)2

    摘要:內(nèi)容列表元組操作字符串操作字典操作集合操作文件操作字符編碼與轉(zhuǎn)碼內(nèi)置函數(shù)在中,最基本的數(shù)據(jù)結(jié)構(gòu)是序列。序列中的每個元素被分配一個序號即元素的位置,也稱為索引。空字典不包括任何項由兩個大括號組成。 day2內(nèi)容1、列表、元組操作2、字符串操作3、字典操作4、集合操作5、文件操作6、字符編碼與轉(zhuǎn)碼7、內(nèi)置函數(shù) 在Python中,最基本的數(shù)據(jù)結(jié)構(gòu)是序列(sequence)。序列中的每個元素被...

    Binguner 評論0 收藏0
  • 比特幣交易(一)

    摘要:在比特幣白皮書中,有三段話很關(guān)鍵的話,解釋了交易是什么。電子貨幣從所有者轉(zhuǎn)移給下一個人是通過,所有者使用私鑰,對交易和下一個人的公鑰進行數(shù)字簽名,并將數(shù)字簽名附在這枚電子貨幣數(shù)字簽名鏈的后面。 在比特幣白皮書中,有三段話很關(guān)鍵的話,解釋了交易 Transactions 是什么。 雖然數(shù)字簽名(Digital signatures)部分解決了電子現(xiàn)金系統(tǒng)的問題,但是仍然需要第三方的支持...

    Blackjun 評論0 收藏0
  • 為項目配置docker

    摘要:和首先,在以往的項目中,都是使用的形式來配置的,所以,首先就需要了解這兩者的關(guān)系。完整配置文件版本號服務(wù)官方參考 之前就了解過docker,但是一直沒有自己配置過docker。這次自己為項目配置了一下docker,在這里做一下總結(jié)記錄。 Dockerfile和docker-compose 首先,在以往的項目中,都是使用DockerFile + docker-compose的形式來配置d...

    qiangdada 評論0 收藏0
  • 如何在NEO區(qū)塊鏈上實現(xiàn)信息加密

    摘要:首先,和擁有一對密鑰,接著,和互換公鑰,與互換公鑰互換公鑰后便可使用一種稱為橢圓曲線密鑰交換體制見維基百科的常見技術(shù)創(chuàng)建雙方的共享密鑰。上文僅是的基本介紹,下文將講解怎樣使用為區(qū)塊鏈上的信息加密。 你或許已經(jīng)知道,區(qū)塊鏈上的交易大多都是透明公開的,用戶既可以直接通過RPC查詢NEO節(jié)點,也可以使用NEOTracker或NEOScan等方便好用的區(qū)塊鏈瀏覽器瀏覽交易記錄、余額、智能合約或...

    darcrand 評論0 收藏0
  • 超贊!快來用Python搭建你AI老婆吧!

    摘要:夏天太熱,又不想出門,就讓我們用的來搭建屬于自己的可以對話的老婆吧本文擬使用的開發(fā)語言實現(xiàn)類似于的平臺的小娜,或者是下的的。 夏天太熱,又不想出門,就讓我們用的Python來搭建屬于自己的?可以對話的AI老婆吧?   本文擬使用Python的開發(fā)語言實現(xiàn)類似于的WIndows平臺的小娜,或者是IOS下的Siri的。最終達到人機對話的效果。 showImg(https://segment...

    Tychio 評論0 收藏0

發(fā)表評論

0條評論

魏明

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<