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
>

浙公网安备 33010602011771号