先从XmlConfigBuilder开始
private void parseConfiguration(XNode root) {
try {
this.propertiesElement(root.evalNode("properties"));
this.typeAliasesElement(root.evalNode("typeAliases"));
this.pluginElement(root.evalNode("plugins"));
this.objectFactoryElement(root.evalNode("objectFactory"));
this.objectWrapperFactoryElement(root.evalNode("objectWrapperFactory"));
this.reflectionFactoryElement(root.evalNode("reflectionFactory"));
this.settingsElement(root.evalNode("settings"));
this.environmentsElement(root.evalNode("environments"));
this.databaseIdProviderElement(root.evalNode("databaseIdProvider"));
this.typeHandlerElement(root.evalNode("typeHandlers"));
this.mapperElement(root.evalNode("mappers"));
} catch (Exception var3) {
throw new BuilderException("Error parsing SQL Mapper Configuration. Cause: " + var3, var3);
}
}
上面的代码加载mybatis-config.xml中的各个字节点的内容,以this.propertiesElement(root.evalNode("properties")), 其中具体的内容是
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 = this.configuration.getVariables(); if(vars != null) { defaults.putAll(vars); } this.parser.setVariables(defaults); this.configuration.setVariables(defaults); } } 其功能是获取<properties resource="mysql-config.properties" />的内容, 其中resource和URL不能并存,否则就会抛出异常,因为加载数据库相关信息有两种方式,所以根据if判断进入不同的信息,其他的标签也类似。接下来跟踪defaults.putAll(Resources.getResourceAsProperties(resource));具体的内容是
public static Properties getResourceAsProperties(String resource) throws IOException { Properties props = new Properties(); InputStream in = getResourceAsStream(resource); props.load(in); in.close(); return props;} 结果是返回引入的properties文件的内容,然后保存可用的信息。