日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

inputstream 初始化_MyBatis初始化之加载初始化

發(fā)布時間:2025/3/20 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 inputstream 初始化_MyBatis初始化之加载初始化 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

在MyBatis初始化過程中,大致會有以下幾個步驟:

1. 創(chuàng)建Configuration全局配置對象,會往TypeAliasRegistry別名注冊中心添加Mybatis需要用到的相關(guān)類,并設(shè)置默認(rèn)的語言驅(qū)動類為XMLLanguageDriver

2. 加載mybatis-config.xml配置文件、Mapper接口中的注解信息和XML映射文件,解析后的配置信息會形成相應(yīng)的對象并保存到Configuration全局配置對象中

3. 構(gòu)建DefaultSqlSessionFactory對象,通過它可以創(chuàng)建DefaultSqlSession對象,MyBatis中SqlSession的默認(rèn)實現(xiàn)類

因為整個初始化過程涉及到的代碼比較多,所以拆分成了四個模塊依次對MyBatis的初始化進行分析:

? 《MyBatis初始化(一)之加載mybatis-config.xml》

? 《MyBatis初始化(二)之加載Mapper接口與XML映射文件》

? 《MyBatis初始化(三)之SQL初始化(上)》

? 《MyBatis初始化(四)之SQL初始化(下)》

由于在MyBatis的初始化過程中去解析Mapper接口與XML映射文件涉及到的篇幅比較多,XML映射文件的解析過程也比較復(fù)雜,所以才分成了后面三個模塊,逐步分析,這樣便于理解

初始化(一)之加載mybatis-config.xml

本文主要分享的是在MyBatis初始化過程中,是如何加載mybatis-config.xml配置文件的,配置描述請參考:MyBatis官方文檔的配置說明

初始化入口在org.apache.ibatis.session.SqlSessionFactoryBuilder構(gòu)造器中,因為需要通過mybatis-config.xml配置文件構(gòu)建一個SqlSessionFactory工廠,用于創(chuàng)建SqlSession會話

主要涉及到以下幾個類:

? org.apache.ibatis.session.SqlSessionFactoryBuilder:用于構(gòu)建SqlSessionFactory工廠

? org.apache.ibatis.builder.xml.XMLConfigBuilder:根據(jù)配置文件進行解析,開始Mapper接口與XML映射文件的初始化,生成Configuration全局配置對象

? org.apache.ibatis.builder.xml.XMLMapperBuilder:繼承BaseBuilder抽象類,用于解析XML映射文件內(nèi)的標(biāo)簽

? org.apache.ibatis.session.Configuration:MyBatis的全局配置對象,保存所有的配置與初始化過程所產(chǎn)生的對象

SqlSessionFactoryBuilder

org.apache.ibatis.session.SqlSessionFactoryBuilder:構(gòu)建SqlSessionFactory工廠類,里面定義了許多build重載方法,主要分為處理Reader和InputStream兩種文件資源對象

我們來看看其中的一個build方法:

public class SqlSessionFactoryBuilder {

public SqlSessionFactory build(Reader reader) {

return build(reader, null, null);

}

/**

* 構(gòu)造 SqlSessionFactory 對象

*

* @param reader Reader 對象

* @param environment 環(huán)境

* @param properties Properties 變量

* @return SqlSessionFactory 對象

*/

public SqlSessionFactory build(Reader reader, String environment, Properties properties) {

try {

/*

* <1> 創(chuàng)建 XMLConfigBuilder 對象

* 會生成一個 XPathParser,包含 Document 對象

* 會創(chuàng)建一個 Configuration 全局配置對象

*/

XMLConfigBuilder parser = new XMLConfigBuilder(reader, environment, properties);

/*

* <2> 解析 XML 文件并配置到 Configuration 全局配置對象中

* <3> 創(chuàng)建 DefaultSqlSessionFactory 對象

*/

return build(parser.parse());

} catch (Exception e) {

throw ExceptionFactory.wrapException("Error building SqlSession.", e);

} finally {

ErrorContext.instance().reset();

try {

reader.close();

} catch (IOException e) {

// Intentionally ignore. Prefer previous error.

}

}

}

}

build方法主要做了三件事:

1. 創(chuàng)建XMLConfigBuilder對象,生成XPathParser配置文件解析器對象和Configuration全局配置對象

2. 通過XMLConfigBuilder對象解析XML映射文件,配置信息、生成的相應(yīng)對象都會保存至Configuration全局配置對象中

3. 構(gòu)建一個DefaultSqlSessionFactory對象

XMLConfigBuilder

org.apache.ibatis.builder.xml.XMLConfigBuilder:根據(jù)配置文件進行解析,開始Mapper接口與XML映射文件的初始化,生成Configuration全局配置對象

構(gòu)造方法

public XMLConfigBuilder(Reader reader, String environment, Properties props) {

this(new XPathParser(reader, true, props, new XMLMapperEntityResolver()), environment, props);

}

private XMLConfigBuilder(XPathParser parser, String environment, Properties props) {

// <1> 創(chuàng)建 Configuration 對象

super(new Configuration());

// 創(chuàng)建一個當(dāng)前線程的上下文,記錄錯誤信息

ErrorContext.instance().resource("SQL Mapper Configuration");

// <2> 設(shè)置 Configuration 的 variables 屬性

this.configuration.setVariables(props);

this.parsed = false;

this.environment = environment;

this.parser = parser;

}

1. 首先會進入XPathParser的構(gòu)造方法,將XML配置文件解析成org.w3c.dom.Document對象,這里傳入了XMLMapperEntityResolver作為解析實例對象,其中使用到MyBatis本地的DTD文件

2. 然后進入XMLConfigBuilder的另一個構(gòu)造方法,會先創(chuàng)建一個Configuration全局配置對象,初始化一些對象

parse方法

public Configuration parse() {

// <1.1> 若已解析,拋出 BuilderException 異常

if (parsed) {

throw new BuilderException("Each XMLConfigBuilder can only be used once.");

}

// <1.2> 標(biāo)記已解析

parsed = true;

// <2> 解析 XML configuration 節(jié)點

parseConfiguration(parser.evalNode("/configuration"));

return configuration;

}

private void parseConfiguration(XNode root) {

try {

// issue #117 read properties first

// <1> 解析 標(biāo)簽

propertiesElement(root.evalNode("properties"));

// <2> 解析 標(biāo)簽,解析配置生成 Properties 對象

Properties settings = settingsAsProperties(root.evalNode("settings"));

// 根據(jù)配置加載自定義 VFS 實現(xiàn)類

loadCustomVfs(settings);

// 根據(jù)配置加載自定義的 Log 實現(xiàn)類

loadCustomLogImpl(settings);

// <3> 解析 標(biāo)簽,生成別名與類的映射關(guān)系

typeAliasesElement(root.evalNode("typeAliases"));

// <4> 解析 標(biāo)簽,添加自定義攔截器插件

pluginElement(root.evalNode("plugins"));

// <5> 解析 標(biāo)簽,自定義實例工廠

objectFactoryElement(root.evalNode("objectFactory"));

// <6> 解析 標(biāo)簽,自定義 ObjectWrapperFactory 工廠,無默認(rèn)實現(xiàn)

objectWrapperFactoryElement(root.evalNode("objectWrapperFactory"));

// <7> 解析 標(biāo)簽,自定義 Reflector 工廠

reflectorFactoryElement(root.evalNode("reflectorFactory"));

// 將 配置信息添加到 Configuration 屬性

settingsElement(settings);

// read it after objectFactory and objectWrapperFactory issue #631

// <8> 解析 標(biāo)簽,自定義當(dāng)前環(huán)境信息

environmentsElement(root.evalNode("environments"));

// <9> 解析 標(biāo)簽,數(shù)據(jù)庫標(biāo)識符

databaseIdProviderElement(root.evalNode("databaseIdProvider"));

// <10> 解析 標(biāo)簽,自定義類型處理器

typeHandlerElement(root.evalNode("typeHandlers"));

// <11> 解析 標(biāo)簽,掃描Mapper接口并進行解析

mapperElement(root.evalNode("mappers"));

} catch (Exception e) {

throw new BuilderException("Error parsing SQL Mapper Configuration. Cause: " + e, e);

}

}

在parse()解析方法中,獲取到Document對象的節(jié)點,然后調(diào)用parseConfiguration進行解析,依次解析以下標(biāo)簽:

<1> 解析 標(biāo)簽,調(diào)用propertiesElement方法

<2>解析標(biāo)簽,解析配置生成 Properties 對象,調(diào)用settingsAsProperties方法

<3> 解析標(biāo)簽,生成別名與類的映射關(guān)系,調(diào)用typeAliasesElement方法

<4> 解析標(biāo)簽,添加自定義攔截器插件,調(diào)用pluginElement方法

<5> 解析標(biāo)簽,自定義實例工廠,調(diào)用objectFactoryElement方法

<6>解析 標(biāo)簽,自定義 ObjectWrapperFactory 工廠,調(diào)用objectWrapperFactoryElement方法

<7> 解析標(biāo)簽,自定義 Reflector 工廠,調(diào)用reflectorFactoryElement方法

<8> 解析標(biāo)簽,自定義當(dāng)前環(huán)境信息,調(diào)用environmentsElement方法

<9>解析標(biāo)簽,數(shù)據(jù)庫標(biāo)識符,調(diào)用databaseIdProviderElement方法

<10>解析標(biāo)簽,自定義類型處理器,調(diào)用typeHandlerElement方法

<11> 解析標(biāo)簽,掃描Mapper接口并進行解析,調(diào)用mapperElement方法

關(guān)于MyBatis的配置描述請參考MyBatis官方文檔的配置說明

上面涉及到的解析方法就不一一列出來了

總結(jié)

以上是生活随笔為你收集整理的inputstream 初始化_MyBatis初始化之加载初始化的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产丝袜自拍 | 亚洲13p| 欧美性猛交xxxx乱大交退制版 | 麻豆视频观看 | 色呦呦免费 | 久久久久久成人 | 国产激情一区二区三区视频免樱桃 | 国产不卡在线 | 国产视频成人 | 亚洲欧美国产高清va在线播放 | 亚洲av综合色区无码一区爱av | 91娇羞白丝网站 | 老司机综合网 | 性无码专区无码 | 一区二区三区在线 | 久久这里 | www.日日日| 樱空桃在线观看 | 操人视频免费 | 51ⅴ精品国产91久久久久久 | 亚洲综合激情网 | 后进极品美女白嫩翘臀 | 成人黄色激情 | 亚洲羞羞| 国产污视频 | 亚洲精品亚洲人成人网 | 蜜桃成人免费视频 | 欧洲亚洲一区二区 | 中文字幕一区二区三区人妻在线视频 | 欧美精品一区二区三区久久久 | 涩涩视频网站在线观看 | 国产美女免费观看 | 丁香七月婷婷 | 美女福利视频 | 性xxxx视频播放免费 | 这里只有精品在线播放 | 精品久久久无码中文字幕边打电话 | 奇米精品一区二区三区四区 | 西西人体www大胆高清 | 91久久精品夜夜躁日日躁欧美 | 俄罗斯黄色录像 | 午夜亚洲精品 | 黄色香蕉网 | 成人自拍偷拍 | 懂色av一区二区三区免费 | 性欧美丰满熟妇xxxx性 | 久久99精品久久久久久 | 波多野结衣电影在线播放 | 99久久久无码国产精品 | 黑森林av凹凸导航 | 99一级片| 手机在线一区二区 | 特级丰满少妇一级aaa爱毛片 | 欧美一二三视频 | 伊人影院av | 沟厕沟厕近拍高清视频 | 波多野结衣乳巨码无在线观看 | 免费黄色网址在线观看 | 高跟鞋丝袜猛烈xxxx | 精品一区在线视频 | 国产精品第7页 | 特级西西人体444www高清大胆 | 中文字幕亚洲成人 | 久久视频免费在线观看 | 色羞羞 | 黄色不卡av| 日本中文字幕视频在线 | 日本精品久久久久久久 | 好男人资源 | 成人免费看片98 | 欧美性网址 | 中文字幕一区二区三区在线观看 | 麻豆爱爱视频 | 男女洗澡互摸私密部位视频 | 免费在线播放黄色片 | 亚洲av综合色区无码二区爱av | 光棍影院一区二区 | 熟妇人妻中文字幕 | 97理伦 | www.av777| 午夜小视频在线 | www.精品一区 | 制服丝袜av在线播放 | 中文字幕在线官网 | 久久av高潮av | 国产黄色片免费观看 | 97人妻精品一区二区三区视频 | 麻豆视频传媒 | 三级欧美日韩 | 免费观看全黄做爰的视频 | 久章操| 国产精品一卡二卡在线观看 | 亚洲va欧美va天堂v国产综合 | a√在线 | 在线欧美视频 | 看毛片网站 | 国内自拍视频在线播放 | 女人扒开屁股让男人桶 | 一级二级三级黄色片 |