MyBatis整合Spring的實現(6)

分析java

MyBatis整合Spring的實現(3)中能夠知道,XMLConfigBuilder類讀取MyBatis的全局配置文件信息轉成Document,具體的把Document轉成JAVA類,作了哪些操做呢?下面就來分析XMLConfigBuilder的解析app

MyBatis整合Spring的實現(1)代碼實現的4.7,建立事務在後面文章會介紹。ide

1 入口
ui

public Configuration parse() {
    if (parsed) {
      throw new BuilderException("Each XMLConfigBuilder can only be used once.");
    }
    parsed = true;
    parseConfiguration(parser.evalNode("/configuration"));
    return configuration;
}

上述代碼,若是文件已經被解析,也就是會拋出異常。這裏解析直接返回Configuration(全局配置類),由於Configuration(全局配置類)是成員變量,因此在方法parseConfiguration中進行設置值也是沒有問題的。下面就分析一下具體解析代碼。
url

2 方法parseConfigurationspa

private void parseConfiguration(XNode root) {
    try {
      propertiesElement(root.evalNode("properties")); //issue #117 read properties first
      typeAliasesElement(root.evalNode("typeAliases"));
      pluginElement(root.evalNode("plugins"));
      objectFactoryElement(root.evalNode("objectFactory"));
      objectWrapperFactoryElement(root.evalNode("objectWrapperFactory"));
      settingsElement(root.evalNode("settings"));
      environmentsElement(root.evalNode("environments")); // read it after objectFactory and objectWrapperFactory issue #631
      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);
    }
}

上述代碼太多了,看着頭暈,因此來進行分解,對propertiesElement(root.evalNode("properties"));進行分析(這裏的解析是對MyBatis的全局配置文件而不是Spring的配置文件)。上面的方法都是XMLConfigBuilder類的內部方法。.net

3 方法propertiesElementcode

private void propertiesElement(XNode context) throws Exception {
    if (context != null) {
      Properties defaults = context.getChildrenAsProperties();
      String resource = context.getStringAttribute("resource");
      String url = context.getStringAttribute("url");
      if (resource != null && url != null) {
        throw new BuilderException("The properties element cannot specify both a URL and a resource based property file reference.  Please specify one or the other.");
      }
      if (resource != null) {
        defaults.putAll(Resources.getResourceAsProperties(resource));
      } else if (url != null) {
        defaults.putAll(Resources.getUrlAsProperties(url));
      }
      Properties vars = configuration.getVariables();
      if (vars != null) {
        defaults.putAll(vars);
      }
      parser.setVariables(defaults);
      configuration.setVariables(defaults);
    }
  }

做者沒有使用過properties,根據上面代碼,反推出下面配置信息。從全局配置文件中獲取有哪些配置信息,在讀取properties文件,resource與url只能設置一個,不然拋異常。最後把"全局配置類"原有的屬性和獲取的屬性合併。orm

4 MyBatis全局配置XML文件xml

<configuration>
    <properties resource="dbc.properties">
        <property name="test" value="test"/>
    </properties>
</configuration>

總結:

MyBatis的解析是最重要的一部分,目前只是對全局配置文件進行解析,後面還有對SQL進行解析,解析的步驟也很是的多,類的嵌套也很是多,可是思路必定要清晰。

Configuration(全局配置類)是最後解析全部配置所存在的最終信息。裏面的不一樣屬性,在MyBatis內部有不一樣的功能,這裏的parseConfiguration方法內部的方法,分解成每一個小方法去分析,這樣就不會看了後面而不知道,當前變量究竟是哪裏來的,變量是要作什麼的。

相關文章
相關標籤/搜索