文章目录
一、SqlSessionFactoryBuilder.build()是干什么的?
SqlSessionFactoryBuilder.build() 是把我们的XML、Mapper、和配置文件加载转换成Bean的重要操作
二、源码分析
1.SqlSessionFactoryBuilder源码
看一下源码:
public SqlSessionFactory build(Reader reader, String environment, Properties properties) {
try {
//1、解析配置文件
XMLConfigBuilder parser = new XMLConfigBuilder(reader, environment, properties);
return build(parser.parse());
} catch (Exception e) {
throw ExceptionFactory.wrapException("Error building SqlSession.", e);
} finally {
ErrorContext.instance().reset();
try {
reader.close();
} catch (IOException e) {
// Intentionally ignore. Prefer previous error.
}
}
}
我们发现源码中又调用了 XMLConfigBuilder parser = new XMLConfigBuilder(reader, environment, properties);去解析我们的配置文件
那么我们继续去看一下这个方法:
2.XMLConfigBuilder解析配置文件
解析流程:
1、创建好XMLConfigBuilder对象调用.parse()方法
我们看一下parse()方法
public Configuration parse() {
//XMLConfigBuilder只被解析一次
if (parsed) {
throw new BuilderException("Each XMLConfigBuilder can only be used once.");
}
parsed = true;
parseConfiguration(parser.evalNode("/configuration"));
return configuration;
}
发现解析过程又调用了parseConfiguration()方法 我们继续去看
2、检查、封装数据
private void parseConfiguration(XNode root) {
try {
//issue #117 read properties first
propertiesElement(root.evalNode("properties"));//封装xml中propertise
typeAliasesElement(root.evalNode("typeAliases"));
pluginElement(root.evalNode("plugins"));
objectFactoryElement(root.evalNode("objectFactory"));
objectWrapperFactoryElement(root.evalNode("objectWrapperFactory"));
reflectionFactoryElement(root.evalNode("reflectionFactory"));
settingsElement(root.evalNode("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"));//封装xml中mapper
} catch (Exception e) {
throw new BuilderException("Error parsing SQL Mapper Configuration. Cause: " + e, e);
}
}
我们可以看到进行各种封装,我们在XML中没有配置的就不会封装
3、封装数据封装到哪里呢?
从源码可以看到组后数据是封装到了我们的Configuration这个类中
4、分别解析到Configuration的哪些属性中呢?
我们看一下最后一步怎么解析Mapper的 也就是mapperElement(root.evalNode(“mappers”));这行代码
我们看核心源码:
XMLMapperBuilder mapperParser = new XMLMapperBuilder(inputStream, configuration, resource, configuration.getSqlFragments());
mapperParser.parse();
通过XMLMapperBuilder去读取XML文件然后去调用parse()封装
映射文件解析放到:loadedResources中
protected final Set<String> loadedResources = new HashSet<String>();
dao层Mapper接口解析到:mapperRegistry中
protected MapperRegistry mapperRegistry = new MapperRegistry(this);