您好,登錄后才能下訂單哦!
本文主要分析SqlSessionFactory的構建過程
SqlSessionFactoryBuilder從XML中構建SqlSessionFactory
String resource = "org/mybatis/example/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSessionFactoryBuilder用來創建SqlSessionFactory實例,一旦創建了SqlSessionFactory,就不再需要它了
public SqlSessionFactory build(InputStream inputStream) {
return build(inputStream, null, null);
}
調用
public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties)
源碼如下:
/**
* 根據配置創建SqlSessionFactory
*
* @param inputStream 配置文件輸入流
* @param environment 環境名稱
* @param properties 外部配置
* @return
*/
public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) {
try {
XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties);
//parser.parse()讀取配置文件返回configuration
//build()根據返回的configuration創建SqlSessionFactory
return build(parser.parse());
} catch (Exception e) {
throw ExceptionFactory.wrapException("Error building SqlSession.", e);
} finally {
ErrorContext.instance().reset();
try {
inputStream.close();
} catch (IOException e) {
// Intentionally ignore. Prefer previous error.
}
}
}
最終創建DefaultSqlSessionFactory實例
public SqlSessionFactory build(Configuration config) {
return new DefaultSqlSessionFactory(config);
}
其中
XMLConfigBuilder與Configuration
XMLConfigBuilder的方法parse()
public Configuration parse() {
if (parsed) {
throw new BuilderException("Each XMLConfigBuilder can only be used once.");
}
parsed = true;
//讀取mybatis-config.xml配置信息,"configuration"是根結點
parseConfiguration(parser.evalNode("/configuration"));
return configuration;
}
XMLConfigBuilder的方法parseConfiguration(XNode root)
/**
* 讀取配置文件組裝configuration
* @param root 配置文件的configuration節點
*/
private void parseConfiguration(XNode root) {
try {
//issue #117 read properties first
propertiesElement(root.evalNode("properties"));
typeAliasesElement(root.evalNode("typeAliases"));
pluginElement(root.evalNode("plugins"));
objectFactoryElement(root.evalNode("objectFactory"));
objectWrapperFactoryElement(root.evalNode("objectWrapperFactory"));
reflectionFactoryElement(root.evalNode("reflectionFactory"));
settingsElement(root.evalNode("settings"));
// read it after objectFactory and objectWrapperFactory issue #631
environmentsElement(root.evalNode("environments"));
databaseIdProviderElement(root.evalNode("databaseIdProvider"));
typeHandlerElement(root.evalNode("typeHandlers"));
mapperElement(root.evalNode("mappers"));
} catch (Exception e) {
throw new BuilderException("Error parsing SQL Mapper Configuration. Cause: " + e, e);
}
}
關于配置文件相關的源碼分析參看:
http://www.iocoder.cn/MyBatis/udbwcso/Configuration
從SqlSessionFactory和Configuration的創建過程中可以看出它們都使用了建造者模式.
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。