摘要:使用方式別名的實(shí)現(xiàn)方式有三種指定一個(gè)類路徑,并指定這個(gè)類的別名第二種方式,指定類名和別名指定一個(gè)包名,會(huì)自動(dòng)掃描包下可以使用別名的類源碼分析的加載過(guò)程代碼入口的加載方式,首先進(jìn)入標(biāo)簽后,先判斷子節(jié)點(diǎn)。
mybatis 別名
1.別名的作用
別名是一個(gè)指代的名稱,當(dāng)類的全限定名過(guò)長(zhǎng)的時(shí)候,我們可以用一個(gè)簡(jiǎn)短的名稱指代它,這個(gè)名稱可以再全文指代。
2.使用方式
別名的實(shí)現(xiàn)方式有三種
(1).指定一個(gè)類路徑,并指定這個(gè)類的別名
(2).第二種方式,指定類名和別名
(3).指定一個(gè)包名,mybatis會(huì)自動(dòng)掃描包下可以使用別名的類
3.源碼分析
代碼入口:typeAliasesElement(root.evalNode("typeAliases"));
typeAlias的加載方式,首先進(jìn)入
(1).如果子節(jié)點(diǎn)是
調(diào)用configuration.getTypeAliasRegistry().registerAliases(typeAliasPackage)方法
(2).如果子節(jié)點(diǎn)是
如果type為null,調(diào)用typeAliasRegistry.registerAlias(clazz);
如果type不為null,調(diào)用typeAliasRegistry.registerAlias(alias, clazz)
private void typeAliasesElement(XNode parent) { if (parent != null) { //獲取所有的子節(jié)點(diǎn) 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 對(duì)應(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); } } } } }
分析別名的加載,三種情況
首先分析指定類路徑,并指定這個(gè)類的別名的加載方式。原因是另外兩種方法其實(shí)最后還是調(diào)用了這個(gè)方式
//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);
//處理思路是通過(guò)type獲取類名,然后調(diào)用registerAlias(alias, type)方法
public void registerAlias(Class> type) { //獲取全路徑類名的簡(jiǎn)稱 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()) { // 為類型注冊(cè)別名 registerAlias(type); } }
}
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/75920.html
摘要:內(nèi)容列表元組操作字符串操作字典操作集合操作文件操作字符編碼與轉(zhuǎn)碼內(nèi)置函數(shù)在中,最基本的數(shù)據(jù)結(jié)構(gòu)是序列。序列中的每個(gè)元素被分配一個(gè)序號(hào)即元素的位置,也稱為索引??兆值洳话ㄈ魏雾?xiàng)由兩個(gè)大括號(hào)組成。 day2內(nèi)容1、列表、元組操作2、字符串操作3、字典操作4、集合操作5、文件操作6、字符編碼與轉(zhuǎn)碼7、內(nèi)置函數(shù) 在Python中,最基本的數(shù)據(jù)結(jié)構(gòu)是序列(sequence)。序列中的每個(gè)元素被...
摘要:在比特幣白皮書(shū)中,有三段話很關(guān)鍵的話,解釋了交易是什么。電子貨幣從所有者轉(zhuǎn)移給下一個(gè)人是通過(guò),所有者使用私鑰,對(duì)交易和下一個(gè)人的公鑰進(jìn)行數(shù)字簽名,并將數(shù)字簽名附在這枚電子貨幣數(shù)字簽名鏈的后面。 在比特幣白皮書(shū)中,有三段話很關(guān)鍵的話,解釋了交易 Transactions 是什么。 雖然數(shù)字簽名(Digital signatures)部分解決了電子現(xiàn)金系統(tǒng)的問(wèn)題,但是仍然需要第三方的支持...
摘要:和首先,在以往的項(xiàng)目中,都是使用的形式來(lái)配置的,所以,首先就需要了解這兩者的關(guān)系。完整配置文件版本號(hào)服務(wù)官方參考 之前就了解過(guò)docker,但是一直沒(méi)有自己配置過(guò)docker。這次自己為項(xiàng)目配置了一下docker,在這里做一下總結(jié)記錄。 Dockerfile和docker-compose 首先,在以往的項(xiàng)目中,都是使用DockerFile + docker-compose的形式來(lái)配置d...
摘要:首先,和擁有一對(duì)密鑰,接著,和互換公鑰,與互換公鑰互換公鑰后便可使用一種稱為橢圓曲線密鑰交換體制見(jiàn)維基百科的常見(jiàn)技術(shù)創(chuàng)建雙方的共享密鑰。上文僅是的基本介紹,下文將講解怎樣使用為區(qū)塊鏈上的信息加密。 你或許已經(jīng)知道,區(qū)塊鏈上的交易大多都是透明公開(kāi)的,用戶既可以直接通過(guò)RPC查詢NEO節(jié)點(diǎn),也可以使用NEOTracker或NEOScan等方便好用的區(qū)塊鏈瀏覽器瀏覽交易記錄、余額、智能合約或...
摘要:夏天太熱,又不想出門,就讓我們用的來(lái)搭建屬于自己的可以對(duì)話的老婆吧本文擬使用的開(kāi)發(fā)語(yǔ)言實(shí)現(xiàn)類似于的平臺(tái)的小娜,或者是下的的。 夏天太熱,又不想出門,就讓我們用的Python來(lái)搭建屬于自己的?可以對(duì)話的AI老婆吧? 本文擬使用Python的開(kāi)發(fā)語(yǔ)言實(shí)現(xiàn)類似于的WIndows平臺(tái)的小娜,或者是IOS下的Siri的。最終達(dá)到人機(jī)對(duì)話的效果。 showImg(https://segment...
閱讀 2141·2021-11-24 09:39
閱讀 1518·2019-08-30 15:44
閱讀 1974·2019-08-29 17:06
閱讀 3428·2019-08-29 16:32
閱讀 3570·2019-08-29 16:26
閱讀 2679·2019-08-29 15:35
閱讀 3047·2019-08-29 12:50
閱讀 1667·2019-08-29 11:15