MyBatis源码解析之SqlSession的创建
在此声明,此文章是对江荣波老师的《MyBatis3源码深度解析》的总结,尊重原作者。
XPath方式解析XML文件
MyBatis的主配置和Mapper配置都使用的XML格式。MyBatis中的Configuration组件用于描述主配置文件信息,框架在启动的时候会解析XML配置,将配置信息转换为Configuration对象。
JDK API中提供了三种方式解析XML,分别为DOM,SAX和XPath。因为XPath的API最易使用,所以MyBatis用的就是XPath的方式解析XML文件中的配置信息。
Configuration的创建
MyBatis通过XMLConfigBuilder类完成Configuration对象的构建工作。
@Test
public void testConfiguration() throws IOException {
Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
// 创建XMLConfigBuilder实例
XMLConfigBuilder builder = new XMLConfigBuilder(reader);
// 调用XMLConfigBuilder.parse()方法,解析XML创建Configuration对象
Configuration conf = builder.parse();
}
如上面的代码所示,我们首先以MyBatis主配置文件输入流作为参数,创建一个XMLConfigBuilder对象,接着调用XMLConfigBuilder对象的parse()方法创建Configuration对象。
public Configuration parse() {
// 防止parse()方法被同一个实例多次调用
if (parsed) {
throw new BuilderException("Each XMLConfigBuilder can only be used once.");
}
parsed = true;
// 调用XPathParser.evalNode()方法,创建表示configuration节点的XNode对象。
// 调用parseConfiguration()方法对XNode进行处理
parseConfiguration(parser.evalNode("/configuration"));
return configuration;
}
在XMLConfigBuilder类的parse()方法中,首先调用XPathParser的evalNode()方法获取XML配置文件中的configuration节点对应的XNode对象,接着调用parseConfiguration()方法通过XNode对象获取更多的配置信息。
private void parseConfiguration(XNode root) {
try {
//i