MyBatis之XML文件解析Configuration及XMLConfigBuilder概述

Configuration概述

​ 这是表示MyBatis配置的类,MyBatis的启动过程中即是解析XML配置文件及映射文件,并将解析结果填充到Configuration对象中的过程。Configuration对象有众多的属性及关键方法,会在以后的文章中详述。

XMLConfigBuilder对象创建

​ 这个对象用来解析XML文档,创建Configuration对象,并将解析结果填充到Configuration对象中,它继承了BaseBuilder类,具有BaseBuilder的成员变量Configuration、TypeAliasRegistry、TypeHandlerRegistry,同时持有XPathParser对象,用来解析XML文档。

​ 在它的构造方法中,创建了Configuration对象,它可以使用客户传入XPathParser对象,如果客户没有传入XPathParser对象,也会自已创建XPathParser对象。

public class XMLConfigBuilder extends BaseBuilder {
    // 客户使用时,可只传入代表XML文件的输入流对象
    public XMLConfigBuilder(InputStream inputStream) {
    	this(inputStream, null, null);
  	}
    // 如果客户没有传入XPathParser,则自已创建一个XPathParser对象
    public XMLConfigBuilder(InputStream inputStream, String environment, Properties props) {
        // 创建了XPathParser对象
    	this(new XPathParser(inputStream, true, props, new XMLMapperEntityResolver()), environment, props);
  	}
    
	// 若没有XPathParser对象,也会创建这个对象
    // environment表示所使用的环境
    // props是客户传入的属性对象
    private XMLConfigBuilder(XPathParser parser, String environment, Properties props) {
      // 创建了Configuration对象
      super(new Configuration());
      ErrorContext.instance().resource("SQL Mapper Configuration");
      this.configuration.setVariables(props);
      this.parsed = false;
      this.environment = environment;
      this.parser = parser;
   }
}

XMLConfigBuilder主方法

XMLConfigBuilder对外提供的主方法是parse,它返回已解析好的Configuration对象,供客户使用,parse方法调用parseConfiguration解析根节点configuration下的每个子节点。

public class XMLConfigBuilder extends BaseBuilder {
    // 客户调用这个方法获得Configuration对象
    public Configuration parse() {
        if (parsed) {
          throw new BuilderException("Each XMLConfigBuilder can only be used once.");
        }
        parsed = true;
        // 实际调用这个方法解析配置文件根结点configuration下的每个子节点
        parseConfiguration(parser.evalNode("/configuration"));
        return configuration;
    }
    
    // 依次解析根节点下每个子节点:properties,settings,typeAliases,plugins,objectFactory,objectWrapperFactory
    // reflectorFactory,environments,databaseIdProvider,typeHandlers,mappers
    // 每个子节点的解析将单独成文讲述
    private void parseConfiguration(XNode root) {
        
        try {
          //issue #117 read properties first
          propertiesElement(root.evalNode("properties"));
          Properties settings = settingsAsProperties(root.evalNode("settings"));
          loadCustomVfs(settings);
          loadCustomLogImpl(settings);
          typeAliasesElement(root.evalNode("typeAliases"));
          pluginElement(root.evalNode("plugins"));
          objectFactoryElement(root.evalNode("objectFactory"));
          objectWrapperFactoryElement(root.evalNode("objectWrapperFactory"));
          reflectorFactoryElement(root.evalNode("reflectorFactory"));
          settingsElement(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);
        }
      }
}
  

mybatis配置文件之dtd如下

根标签为configuration,其下有properties, settings, typeAliases, typeHandlers, objectFactory, objectWrapperFactory, reflectorFactory, plugins, environments, databaseIdProvider, mappers子标签,在 在XMLConfigBuilder中圴使用一个方法对之进行解析。

<!ELEMENT configuration (properties?, settings?, typeAliases?, typeHandlers?, objectFactory?, objectWrapperFactory?, reflectorFactory?, plugins?, environments?, databaseIdProvider?, mappers?)>

<!ELEMENT databaseIdProvider (property*)>
<!ATTLIST databaseIdProvider
type CDATA #REQUIRED
>

<!ELEMENT properties (property*)>
<!ATTLIST properties
resource CDATA #IMPLIED
url CDATA #IMPLIED
>

<!ELEMENT property EMPTY>
<!ATTLIST property
name CDATA #REQUIRED
value CDATA #REQUIRED
>

<!ELEMENT settings (setting+)>

<!ELEMENT setting EMPTY>
<!ATTLIST setting
name CDATA #REQUIRED
value CDATA #REQUIRED
>

<!ELEMENT typeAliases (typeAlias*,package*)>

<!ELEMENT typeAlias EMPTY>
<!ATTLIST typeAlias
type CDATA #REQUIRED
alias CDATA #IMPLIED
>

<!ELEMENT typeHandlers (typeHandler*,package*)>

<!ELEMENT typeHandler EMPTY>
<!ATTLIST typeHandler
javaType CDATA #IMPLIED
jdbcType CDATA #IMPLIED
handler CDATA #REQUIRED
>

<!ELEMENT objectFactory (property*)>
<!ATTLIST objectFactory
type CDATA #REQUIRED
>

<!ELEMENT objectWrapperFactory EMPTY>
<!ATTLIST objectWrapperFactory
type CDATA #REQUIRED
>

<!ELEMENT reflectorFactory EMPTY>
<!ATTLIST reflectorFactory
type CDATA #REQUIRED
>

<!ELEMENT plugins (plugin+)>

<!ELEMENT plugin (property*)>
<!ATTLIST plugin
interceptor CDATA #REQUIRED
>

<!ELEMENT environments (environment+)>
<!ATTLIST environments
default CDATA #REQUIRED
>

<!ELEMENT environment (transactionManager,dataSource)>
<!ATTLIST environment
id CDATA #REQUIRED
>

<!ELEMENT transactionManager (property*)>
<!ATTLIST transactionManager
type CDATA #REQUIRED
>

<!ELEMENT dataSource (property*)>
<!ATTLIST dataSource
type CDATA #REQUIRED
>

<!ELEMENT mappers (mapper*,package*)>

<!ELEMENT mapper EMPTY>
<!ATTLIST mapper
resource CDATA #IMPLIED
url CDATA #IMPLIED
class CDATA #IMPLIED
>

<!ELEMENT package EMPTY>
<!ATTLIST package
name CDATA #REQUIRED
>
posted @ 2022-04-12 11:05  beckwu  阅读(391)  评论(0)    收藏  举报