mybatis之SqlSessionFactory 原 薦

版本:mybatis-3

主要分析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);
	}
}

關於配置文件相關的源碼分析參看:

https://my.oschina.net/u/657390/blog/661681

設計模式

從SqlSessionFactory和Configuration的創建過程中可以看出它們都使用了建造者模式.

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章