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中圴使用一个方法对之进行解析。