在不使用Spring容器进行管理的情况下,我们通常使用Resources来加载配置文件。
主要用到了io包中的Resources和ClassLoaderWrapper两个类。
Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
Resources类
//持有ClassLoaderWrapper的一个引用
private static ClassLoaderWrapper classLoaderWrapper = new ClassLoaderWrapper();
public static Reader getResourceAsReader(String resource) throws IOException { //包装类
Reader reader;
if (charset == null) {
reader = new InputStreamReader(getResourceAsStream(resource)); //默认charset为空
} else {
reader = new InputStreamReader(getResourceAsStream(resource), charset);
}
return reader;
}
public static InputStream getResourceAsStream(String resource) throws IOException {
return getResourceAsStream(null, resource);
}
//主要调用的是这个方法,委托给classLoaderWrapper去执行配置文件的加载
public static InputStream getResourceAsStream(ClassLoader loader, String resource) throws IOException {
InputStream in = classLoaderWrapper.getResourceAsStream(resource, loader);
if (in == null) {
throw new IOException("Could not find resource " + resource);
}
return in;
}
ClassLoaderWrapper类
public InputStream getResourceAsStream(String resource, ClassLoader classLoader) {
return getResourceAsStream(resource, getClassLoaders(classLoader));
}
====
//获取类加载器,这里使用了
ClassLoader[] getClassLoaders(ClassLoader classLoader) {
return new ClassLoader[]{
classLoader, //空
defaultClassLoader, //空
Thread.currentThread().getContextClassLoader(),
getClass().getClassLoader(),
systemClassLoader};
}
====
//调用了JDK中的getResourceAsStream("/" + resource)获取输入流。
InputStream getResourceAsStream(String resource, ClassLoader[] classLoader) {
for (ClassLoader cl : classLoader) {
if (null != cl) {
// try to find the resource as passed
InputStream returnValue = cl.getResourceAsStream(resource);
// now, some class loaders want this leading "/", so we'll add it and try again if we didn't find the resource
if (null == returnValue) {
returnValue = cl.getResourceAsStream("/" + resource);
}
if (null != returnValue) {
return returnValue;
}
}
}
return null;
}
返回InputStream ,再通过InputStreamReader包装成Reader 。