Spring之资源工具类
1、JDK所提供的访问资源的类并不能很好的满足各种底层资源的访问需求,因此,Spring设计了一个Resource接口 ,为应用提供更强大的底层访问资源的能力:
1)主要方法:
1、 boolean exists(); 表示当前资源是否真的存在。 2、 boolean isOpen(); 表示当前资源是否一个已打开的输入流。,如果返回true,InputStream 不能多次读取, 只能是一次性读取之后,就关闭 InputStream,以防止内存泄漏。常见的Resource实现一般返回false。 3、 URL getURL() throws IOException; 如果当前Resource代表的底层资源能由java.util.URL代表,则返回该URL,否则抛出IOException。 4、 File getFile() throws IOException; 如果当前Resource代表的底层资源能由java.io.File代表,则返回该File,否则抛出IOException。 5、InputStream getInputStream() throws IOException; 每次调用都将返回一个新鲜的资源对应的java.io. InputStream字节流,调用者在使用完毕后必须关闭该资源。
2)具体实现类:
1、ByteArrayResource——字节数组资源 若需要操作描述一个字节数组,可以用这个资源类。ByteArrayResource可多次读取数组资源 2、文件系统资源 FileSystemResource 这个类有2个不可变的属性 file 和 path ,本质上就是一个java.io.File 的包装。 这个类的 equals() 和 hashcode() 都通过属性 path 来操作。 3、InputStreamResource——输入流资源 是一个不可变InputStream的包装和一个不可变的描述字符串。 此外还有一个私有成员变量Boolean read用于限制本资源的InputStream不可被重复获取。 4、ServletContextResource——Servlet上下文资源 这个资源类是为了访问Web容器上下文的资源而封装的类,可以以相对于Web应用根目录的路径加载资源。 这个资源类封装了一个不可变的javax.servlet.ServletContext对象和一个不可变的String对象代表路径。 类中所有操作都基于这两个属性。 5、ClassPathResource——类路径资源 表示的是类路径下的资源,资源以相对于类路径的方式表示。这个资源类有3个成员变量,不可变的相对路径、类加载器、类对象。 这个资源类可以相对于应用程序下的某个类或者相对于整个应用程序,但只能是其中之一,取决于构造方法有没有传入Class参数。 资源类的clazz属性存在,那么资源相对于这个clazz类相对路径的。如果不存在,那么资源类就是相对于整个应用程序的。 6、UrlResource——Url资源 这个资源类封装了可以以URL表示的各种资源。这个资源类有3个属性,URI、URL,规范化后的URL, 用于资源间的比较以及计算HashCode。基本可以看作java.net.URL的封装,这个资源类的很多方法也都是通过URL或URI操作的。
为了访问不同的类型的资源,必须使用相应的Resource实现类比较麻烦,所以提供了一个加载资源的机制,能够自动识别不同的资源类型:
2、资源类型地址前缀
1、classpath 类路径中加载资源,可以加载所有classpath目录所包含的资源 2、file 文件系统中加载资源,可以加载所有文件系统中有权限访问的资源 3、http 使用UrlResource从web服务器中装载资源 4、ftp 使用UrlResource从FTP服务器中装载资源 5、没有前缀 根据ApplicationContext具体实现类采用对应的类型的Resource
3、Ant风格资源地址支持3种匹配符
1、?:匹配文件名中的一个字符 2、* :匹配文件名中任意一个字符 3、** :匹配多层路径
4、资源加载器
1、ResourceLoader 接口可以根据一个资源地址加载文件资源, 资源地址仅支持带资源类型前缀不支持Ant风格的资源路径表达式。 2、ResourcePatternResolve该方法支持带资源类型前缀及Ant风格的资源 3、路径的表达式。PathMatchingResourceResolver 是Spring提供了标准实现类。