mybatis源码解析 IO读取文件模块

前言
我采用的源码地址 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测试方法中运行跟踪。

展开阅读全文

没有更多推荐了,返回首页