MyBatis 3.5 源码分析(二):Executor、StatementHandler 与结果映射
接着上一篇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
好了,下次见。