前言
我采用的源码地址 ibatis源码 在ibatis-2目录里,源码release jar包测试代码在ibatis_release_jar_test目录里。
之所以使用ibatis源码作为阅读对象,要明确的一点就是阅读源码不是为了找工作,而是为了工作为了让水平提高。mybatis源码现在已经优化的越来越好,越来越强大。在这些强大的背后,逻辑业务非常复杂。想要阅读其精髓,那么就要从简单的开始。ibatis代码量小,阅读容易。
在测试使用ibatis时候,第一步会有加载SqlMapConfig.xml文件。
//读取xml文件
Reader reader = Resources.getResourceAsReader("SqlMapConfig.xml");
继续抽丝剥茧。调用Resources类中的getResourceAsReader方法,返回IO中的Reader对象;
并且可以看出Resources类中的方法全是static修饰的方法,直接调用即可。Resources类是ibatis IO的基础类,而且实现方式简单。其他类中的方法读取一个文件,最终都要通过Resources获取所想要的数据结构。
/**@param resource 是SqlMapConfig.xml文件的路径*/
public static Reader getResourceAsReader(String resource)
throws IOException
{
Reader reader;
if (charset == null) {
reader = new InputStreamReader(getResourceAsStream(resource));
} else {
reader = new InputStreamReader(getResourceAsStream(resource), charset);
}
return reader;
}
根据文件路径读取文件返回InputStream的方法是getResourceAsStream,其方法里的核心内容是jdk中的ClassLoader加载文件,然后返回InputStream。
public static InputStream getResourceAsStream(ClassLoader loader,
String resource) throws IOException
{
InputStream in = null;
if (loader != null)
in = loader.getResourceAsStream(resource);
if (in == null)
in = ClassLoader.getSystemResourceAsStream(resource);
if (in == null)
throw new IOException("Could not find resource " + resource);
return in;
}
知道了根据文件路径读取文件返回InputStream的方法。那么可以进一步进行推广,读取properties那正是手到擒来。思路是根据properties文件的inputStream然后,加载到Properties对象中。
//resource是properties文件路径
public static Properties getResourceAsProperties(String resource)
throws IOException {
Properties props = new Properties();
InputStream in = null;
String propfile = resource;
//根据properties文件路径读取properties的inputStream
in = getResourceAsStream(propfile);
props.load(in);
in.close();
return props;
}
上面的方法就是加载SqlMapConfig.xml配置文件,将其变成Reader对象。然后对其下一步操作。ibatis的io块在这里介绍完毕,通过Resources类中的方法,进一步推广,思路是将文件变成reader或者inputStream。
如果想要更加直观的感受在BatchTest测试方法中运行跟踪。