前言
在上一篇文章中我们大致的了解了Mybatis的使用方法以及核心对象。本文将对前文提到的核心对象进行源码分析。
一、Configuration
完整路径:org.apache.ibatis.session.Configuration,顾名思义Configuration这个类是对我们配置文件的封装。我们所编写的XML最终会被Myabtis解析并分装成Configuration对象。下面我们摘取部分源码进行分析
public class Configuration {
//环境
protected Environment environment;
//参数
protected Properties variables = new Properties();
//Mapper注册器
protected final MapperRegistry mapperRegistry = new MapperRegistry(this);
//拦截器链
protected final InterceptorChain interceptorChain = new InterceptorChain();
//类型处理注册器
protected final TypeHandlerRegistry typeHandlerRegistry = new TypeHandlerRegistry(this);
//别名注册器
protected final TypeAliasRegistry typeAliasRegistry = new TypeAliasRegistry();
.....
}
在Configuration中有非常多的属性,例如:
1、Environment(环境):Myabtis是支持多环境的,例如dev、test、product环境;不同的环境可以配置不同的数据源、事务工厂。但是在现在的实际中这一属性基本不太会用,因为现在的多环境是交由Spring来管理。
2、Properties(属性):Mybatis允许用户引入外部配置文件,该参数映射到Mybatis配置文件中节点。用法如下:
3、MapperRegistry:该类存储了我们所编写的Mapper文件(通过解析xxxMapper.xml来封装);采用HashMap来存储。
4、InterceptorChain(拦截器链):InterceptorChain定义了一些列的拦截器用于做一些增强,我们使用的Mybatis-Plus中的分页插件就是使用拦截器来实现的。
二、Configuration什么时候被实例化
这里的实例化指的是Mybatis什么时候把我们编写的Xml文件封装成Configuration这个对象。这就要回到我们最早的如何使用Mybatis的代码中去了。在Java IO的体系中如果想要读取一个文件的内容我们需要通过InputsStream(输入流)来实现。
public class Application {
public static void main(String[] args) throws Exception {
String resource = "mybatis-config.xml";
//读取mybatis配置文件并获取输入流
InputStream inputStream = Resources.getResourceAsStream(resource);
//构建SqlSessionFactory(重点!!)
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//方式一:
try (SqlSession session = sqlSessionFactory.openSession()) {
PersonMapper mapper = session.getMapper(PersonMapper.class);
List<Person> personList = mapper.selectAll();
}
}
}
在该Demo中当我们拿到了输入流之后,接着会去构建一个SqlSessionFactory对象,这就是我们研究的重点代码,进入方法。
可以看到Mybatis拿到输入流之后会去解析咱们的mybatis-config.xml这个配置文件,并返回一个名为XMLConfigBuilder对象。同时构建一个SqlSessionFactory对象需要Configuration对象,而刚好parser.parse()方法就返回了该对象,继续Debug,进入XMLConfigBuilder中。不难看出这些节点都是和我们配置文件一一对应的。
private void parseConfiguration(XNode root) {
try {
//issue #117 read properties first
//解析properties节点
propertiesElement(root.evalNode("properties"));
//解析settings节点
Properties settings = settingsAsProperties(root.evalNode("settings"));
//后面的解析代码省略...
} catch (Exception e) {
throw new BuilderException("Error parsing SQL Mapper Configuration. Cause: " + e, e);
}
}
(补充:Myabtis会将节点分装成XNode对象,采用XPathParser来解析)
三、小结
1、Myabtis解析Xml并生成Configuration对象核心的流程图。
2、在本小结中我们学习了Myabtis是如何将Xml解析成为Configuration对象的
(1)获取输入流
(2)通过输入流创建XmlConfigBuilder(建造者设计模式)
(3)通过XmlConfigBuilder来解析Xml(用到XPathParser来解析,并将每个节点封装成XNode)
(4)解析所有节点并返回Configuration对象
至此我们已经清楚了Mybatis是如何将Xml解析为Configuration对象的,下一篇文章会讲述其他核心对象是如何使用以及如何被实例化的。希望对你有所帮助