Spring源码解析—— ClassPathResource类
来源:互联网 发布:Sony编程 编辑:程序博客网 时间:2024/05/16 16:09
一,简单介绍Spring中资源处理相关类
BeanFactory beanFactory=new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));
在Spring中,定义了接口InputStreamSource,这个类中只包含一个方法:
public interface InputStreamSource {/** * Return an {@link InputStream}. * <p>It is expected that each call creates a <i>fresh</i> stream. * <p>This requirement is particularly important when you consider an API such * as JavaMail, which needs to be able to read the stream multiple times when * creating mail attachments. For such a use case, it is <i>required</i> * that each {@code getInputStream()} call returns a fresh stream. * @return the input stream for the underlying resource (must not be {@code null}) * @throws IOException if the stream could not be opened * @see org.springframework.mail.javamail.MimeMessageHelper#addAttachment(String, InputStreamSource) */InputStream getInputStream() throws IOException;}
用来返回一个基本的InputStream文件。
之后,使用Resource接口来规定对文件的一些基本的操作。对于不同来源的件:classpath,file,url,byte,inputstream...进行处理。在我们的应用程序里面,比较常用的就是对我们classpath下的xml文件进行解析的ClassPathResource。
二,ClassPathResource的构造函数
利用ClassPathResource读取xml配置的基本思路就是通过构造函数传入的文件路径,接着交给class或者classLoader,调用getResourceAsStream获取到InputStream。
所以,我们的private成员变量是这样子定义的:
public class ClassPathResource extends AbstractFileResolvingResource {private final String path;private ClassLoader classLoader;private Class<?> clazz;
主要构造函数(存在多个构造函数,但是都差不多啦):
public ClassPathResource(String path, ClassLoader classLoader) {Assert.notNull(path, "Path must not be null");String pathToUse = StringUtils.cleanPath(path);if (pathToUse.startsWith("/")) {pathToUse = pathToUse.substring(1);}this.path = pathToUse;this.classLoader = (classLoader != null ? classLoader : ClassUtils.getDefaultClassLoader());}
Assert类是spring的一个校验类,比如,如果path为空的话,则会抛出一个异常,异常信息为后面的"Path must not be null"。其实就是封装了一个判断是否为null的操作,查看Assert,发现还有很多类似函数,例如,判断为trueorfalse这种。
之后处理你自己传入的路径。。。。因为这里默认使用ClassLoader来加载资源,所以,路径开头要去掉“/”。但是如果你不传入classLoader,则classLoader按照如下规则获取:
public static ClassLoader getDefaultClassLoader() {ClassLoader cl = null;try {cl = Thread.currentThread().getContextClassLoader();}catch (Throwable ex) {// Cannot access thread context ClassLoader - falling back to system class loader...}if (cl == null) {// No thread context class loader -> use class loader of this class.cl = ClassUtils.class.getClassLoader();}return cl;}
首选我们安全的从当前线程获取类加载器的方法,但是这个方法在 某些情况下会返回null值(可以百度下Thread.currentThread().getContextClassLoader()获取classloader跟使用**Class.getClassLoader()方法有什么不同,如果懒的话,可以看看下面的代码),这个跟JVM的类加载器的层级关系有关。。。
/* 测试利用class或者classloader读取文件classpath下的文件 */public static void getResourceByClassOrClassLoader() {/* * Classloader是从classpath中读取资源的一个类, * 一般我们用classloader来加载class,实际上,但凡是处在classpath中的文件, * 我们称之为资源,都可以用classloader来读取。 * 注意,使用classloader来加载资源的时候,目录前面不加“/” */System.out.println(TestResource.class.getClassLoader().getResource("applicationContext.xml"));/* 这个API的起始路径是当前类的路径,如果要正确的读到资源,目标资源必须和当前class在同一级,或子目录里,可以用相对路径读取到。 */System.out.println(TestResource.class.getResource("/applicationContext.xml"));/*安全用法---提倡使用 From:http://www.cnblogs.com/gaoxing/p/4703412.html*/System.out.println( Thread.currentThread().getContextClassLoader().getResource("applicationContext.xml"));/*读取到InputStream*/InputStream inputStream = TestResource.class.getClassLoader().getSystemResourceAsStream("applicationContext.xml");System.out.println(inputStream);}
区分下使用class 还有classLoader 这两种方式getResource在写法跟实现上有什么不同。
这之后,构造函数完成, XML文件加载完毕。
三,其他方法
1,示例:exists
@Overridepublic boolean exists() {URL url;if (this.clazz != null) {url = this.clazz.getResource(this.path);}else {url = this.classLoader.getResource(this.path);}return (url != null);}
在对资源文件文件进行操作的时候,我们的首选还是使用Class类来进行操作,因为资源和我类文件的位置是相对固定的,可能这是一种潜规则+默认的写法吧。如果执行构造函数的时候没有传入class来进行初始化,则使用classLoader来判断文件。最 后return (url != null);写法挺简洁!
这个类里面的getInputStream,getURL,getDescription都是类似的。
希望没丢掉什么重点。求补充!
- Spring源码解析—— ClassPathResource类
- 解析Spring源码(1)--ClassPathResource("xxx.xml");
- 解析Spring源码(2)---new XmlBeanFactory(new ClassPathResource("..."))
- Spring--ClassPathResource
- ClassPathResource
- Spring源码解析——配置文件读取相关的类
- Spring MVC源码分析—Servlet解析
- Spring源码解析——如何阅读源码
- Spring源码解析——如何阅读源码
- Spring源码解析——如何阅读源码
- Spring源码解析——如何阅读源码
- Spring源码解析——如何阅读源码
- Spring源码解析——如何阅读源码
- Spring源码解析——如何阅读源码
- Spring源码解析——如何阅读源码
- Spring源码解析——start from BeanFactory(一)
- 《spring源码深度解析》读书笔记之——环境搭建
- Spring源码分析2 — XML配置文件的解析流程
- 安卓加载视频缩略图,展示于ListView中,完美实现
- 裂变位法加密 best coder
- Linux服务器利用Nethogs监控每个进程的网络使用情况
- Robot Framework自动化测试框架(二):WEB自动化
- Caffe学习3-使用预训练模型finetuning
- Spring源码解析—— ClassPathResource类
- adapter模板
- (礼拜一log)后台&前端联调:.tld应用
- cocoapods安装及使用(copy别人并加了自己的一些操作)
- VideoCore推流使用教程
- split 分割 字符串(分隔符如:* ^ : | , .) 及注意点
- 《移动端签到》——利用 JavaScript API实现定位
- ibatis和mybatis的区别
- 逆序对数(归并排序)