从 SqlSessionFactoryBuilder 说起
上一篇文章入门的代码第一步的执行就是创建 SqlSessionFactoryBuilder
对象,然后传入配置文件的信息,所以我们首先从 SqlSessionFactoryBuilder
入手。
在 new SqlSessionFactoryBuilder()
之后,我们首先调用了 build(Reader reader)
方法,MyBatis 提供了三个该方法的重载
public SqlSessionFactory build(Reader reader) {
return build(reader, null, null);
}
public SqlSessionFactory build(Reader reader, String environment) {
return build(reader, environment, null);
}
public SqlSessionFactory build(Reader reader, Properties properties) {
return build(reader, null, properties);
}
均指向了 build(InputStream inputStream, String environment, Properties properties)
方法
public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) {
try {
XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties);
return build(parser.parse());
} catch (Exception e) {
throw ExceptionFactory.wrapException("Error building SqlSession.", e);
} finally {
ErrorContext.instance().reset();
try {
inputStream.close();
} catch (IOException e) {
// Intentionally ignore. Prefer previous error.
}
}
}
此方法构建了一个 XMLConfigBuilder
对象,然后调用其 parser.parse()
方法,因此 parse
方法是解析配置文件的核心。
public Configuration parse() {
if (parsed) {
throw new BuilderException("Each XMLConfigBuilder can only be used once.");
}
parsed = true;
parseConfiguration(parser.evalNode("/configuration"));
return configuration;
}
parsed
是 XMLConfigBuilder
对象的成员变量,用于判断是否已经解析,如果已经解析过,则会抛出 BuilderException
异常。 没有解析过的话,会将 parsed=true
并开始执行解析,parseConfiguration 方法解析了根节点,根节点 configuration
,所以我们的配置文件的根节点是 <configuration>
。
配置解析步骤
继续跟踪 parseConfiguration
方法,代码如下:
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);
}
}
可以看到,parseConfiguration()方法传入了配置文件的根节点,在 try 的代码块中,依次解析:
- properties 配置文件
- settings 设置项
- typeAliases 类型别称
- plugins 插件
- …..
- environments 环境配置
- mappers 映射文件
那么我们下一步就是看这块代码,从解析 MyBatis 的配置文件开始,一步一步看如何实现 MyBaits 的。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于