跳到主要内容

MyBatis 3.5 源码分析(二):Executor、StatementHandler 与结果映射

· 阅读需 2 分钟
Apache王也道长
软件开发者与技术作者

接着上一篇mybatis 3.5.x源码系列(1) 我们继续研究一下mybatis的配置读取 MyBatis 将 SQL 执行拆分为多个职责明确的组件,并通过插件机制在关键接口处拦截。分析源码时应结合实际 SQL 和断点观察对象创建与调用顺序。

上一篇我们讲到了xml解析

org.apache.ibatis.builder.xml.XMLConfigBuilder#parseConfiguration(org.apache.ibatis.parsing.XNode root)

这里我们来看看这个方法中的第一步

org.apache.ibatis.builder.xml.XMLConfigBuilder#propertiesElement(org.apache.ibatis.parsing.XNode context)

可以看到propertiesElement接收的参数是root.evalNode("properties")

那么我们看看properties是如何编写?

<properties resource="org/mybatis/example/config.properties">
<property name="username" value="dev_user"/>
<property name="password" value="F2Fa3!33TYyg"/>
</properties>

实际上在properties上有两个属性 resource和url,但是这两个属性不能同时使用

String resource = context.getStringAttribute("resource");
String url = context.getStringAttribute("url");
if (resource != null && url != null) {
throw new BuilderException("The properties element cannot specify both a URL and a resource based property file reference. Please specify one or the other.");
}

resource

org.apache.ibatis.io.Resources#getResourceAsProperties(java.lang.String)
》org.apache.ibatis.io.ClassLoaderWrapper#getResourceAsStream(java.lang.String, java.lang.ClassLoader)
》org.apache.ibatis.io.ClassLoaderWrapper#getClassLoaders(java.lang.ClassLoader)
》org.apache.ibatis.io.ClassLoaderWrapper#getResourceAsStream(java.lang.String, java.lang.ClassLoader[])

这里会分别从classLoader, defaultClassLoader, Thread.currentThread().getContextClassLoader(), getClass().getClassLoader(), ClassLoader.getSystemClassLoader()加载resource指定的properties文件

一般情况下:Thread.currentThread().getContextClassLoader()getClass().getClassLoader()ClassLoader.getSystemClassLoader()都是Launcher$AppClassLoader

url

org.apache.ibatis.io.Resources#getUrlAsProperties(java.lang.String)
》org.apache.ibatis.io.Resources#getUrlAsStream(java.lang.String)

url的加载就比较简单了,采用的java.net.URL#openConnection()的方式加载配置文件 jdk的URL有这些:http(s), jar, file, ftp等等,具体的就是java.net.URLConnection的实现类

无论是resource加载还是url加载,最终加载到配置文件后,把所有解析到的值存放到mybatis默认的defaults properties中

settings, typeAliases, typeHandlers, objectFactory

如何使用,大家可以看看settings typeAliases typeHandlers objectFactory

好了,下次见。

本文阅读量:--

总访问量 -- · 访客数 --