1.读取所有的xml配置文件(注意,和MyBatis有关的所有配置文件)
去取xml配置文件(包括了mybatis-config.xml和mapper.xml)和注解中的配置信息,创建配置对象(Configuration ),并完成各个模块的初始化工作,(在创建该对象的过程中,使用了建造者模式,关于建造者模式的话,需要在设计模式的工程中详细介绍);
首先我们看看,在创建 SqlSessionFactory 的时候,创建了创建配置对象(Configuration ),我们看下面的代码:
String path = "mybatis-config.xml"; InputStream stream = Resources.getResourceAsStream(path); // 1.读取mybatis配置文件创SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(stream);
new SqlSessionFactoryBuilder()根据名字我们可以看出来,已经在使用建造者模式了,这不是我们关注的重点,下面我们键入到sqlSessionFactory 的build(stream)方法;
public SqlSessionFactory build(InputStream inputStream) { return build(inputStream, null, null); }
我们只看主流程,没用的就先删掉了
public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) {
try {
XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties);//读取配置文件
return build(parser.parse());//解析配置文件得到configuration对象,并返回SqlSessionFactory
} catch (Exception e) {
} finally {
ErrorContext.instance().reset();
try {inputStream.close();} catch (IOException e) {}
}
}
下面我们开始看 build()方法 中的 parser.parse()
public class XMLConfigBuilder extends BaseBuilder { public Configuration parse() { if (parsed) { throw new BuilderException("Each XMLConfigBuilder can only be used once."); } parsed = true; parseConfiguration(parser.evalNode("/configuration")); return configuration; } private void parseConfiguration(XNode root) { try { //issue #117 read properties first //解析<properties>节点 propertiesElement(root.evalNode("properties")); //解析<settings>节点 Properties settings = settingsAsProperties(root.evalNode("settings")); loadCustomVfs(settings); //解析<typeAliases>节点 typeAliasesElement(root.evalNode("typeAliases")); //解析<plugins>节点 pluginElement(root.evalNode("plugins")); //解析<objectFactory>节点 objectFactoryElement(root.evalNode("objectFactory")); //解析<objectWrapperFactory>节点 objectWrapperFactoryElement(root.evalNode("objectWrapperFactory")); //解析<reflectorFactory>节点 reflectorFactoryElement(root.evalNode("reflectorFactory")); settingsElement(settings);//将settings填充到configuration // read it after objectFactory and objectWrapperFactory issue #631 //解析<environments>节点 environmentsElement(root.evalNode("environments")); //解析<databaseIdProvider>节点 databaseIdProviderElement(root.evalNode("databaseIdProvider")); //解析<typeHandlers>节点 typeHandlerElement(root.evalNode("typeHandlers")); //解析<mappers>节点 mapperElement(root.evalNode("mappers")); } catch (Exception e) { throw new BuilderException("Error parsing SQL Mapper Configuration. Cause: " + e, e); } } }
原文:https://www.cnblogs.com/lys-lyy/p/11427083.html