Spring框架学习笔记-资源的访问

1.资源标识符

为了访问不同类型的资源,必须使用相应的Resource实现类,这是比较麻烦的。是否可以在不显式使用Resource实现类的情况下,仅通过资源地址的特殊标识就可以加载相应的资源呢?
Spring提供了一个强大的加载资源的机制,不但能够通过"classpath:"、"file:"等资源地址前缀识别不同资源类型,还支持Ant风格带通配符的资源地址。
资源地址表示:
首先,我们来了解一下Spring支持哪些资源类型的地址前缀:
classpath: 示例:classpath:com/baobaotao/beanfactory/beans.xml
file: 示例:file:/conf/com/baobaotao/beanfactory/beans.xml
http:// 示例:http://www.baobaotao.com/resource/beans.xml
ftp:// 示例:ftp://www.baobaotao.com/reource/beans.xml
没有前缀: com/baobaotao/beanfactory/beans.xml、
其中,和"classpath"对应的,还有另一种比较难理解的"classpath*:"的前缀。假设有多个JAR包或文件系统类路径都拥有一个相同的包名(如com.baobaotao)。"classpath:"只会在第一个加载的com.baobaotao包下查找,而后者会扫描所有的com.baobaotao包。
这对于分模块打包是非常有用的,假设一个名为baobaotao的应用共分为3个模块,一个模块对应一个配置文件,分别是module1.xml,module2.xml以及module3.xml,都放在baobaotao目录下,每个模块分别打JAR包。使用"classpath*:com/baobaotao/module*.xml"将可以成功加载到这三个模块的配置文件,而使用"classpath:com/baobaotao/module*.xml"时只会加载一个模块的配置文件。
而Ant风格资源地址符支持三种匹配符:
? 匹配文件名中的一个字符而 * 匹配文件名中的任意一个字符,**匹配多层路径。
下面是几个Ant风格的资源路径的示例:
classpath: com/t?st.xml:匹配com类路径下com/test.xml及com/tast.xml及com/txst.xml。
file:D:/conf/*.xml:匹配文件系统D:/conf目录下的所有以xml为后缀的文件。
classpath:com/ * * /test.xml:匹配com类路径下(当前目录及其子孙目录)的test.xml文件。

2.资源抽象接口

JDK所提供的访问资源的类(如Java.net.URL、File等)并不能很好地满足各种底层资源的访问需求,比如缺少从类途径或者Web容器的上下文中获取资源的操作类。有鉴于此,Spring设计了一个Resource接口,它为应用提供了更强的访问底层资源的能力。该接口拥有对应不同资源类型的实现类。

boolean exists()://资源是否存在
boolean isOpen()://资源是否打开
URL getURL() throws IOException://如果底层资源可以表示成URL,该方法返回对应的URL对象
File getFile() throws IOException://如果底层资源对应一个文件,该方法返回对应的File对象
InputStream getInputStream() throws IOException://返回资源对应的输入流

Resource在Spring框架中起着不可或缺的作用,Spring框架使用Resource装载各种资源,这些资源包括配置文件资源、国际化属性文件资源等。下面我们来了解一下Resource的具体实现类,如图所示:
在这里插入图片描述
ByteArrayResource
二进制数组表示的资源,二进制数组资源可以在内存中通过程序构造。
ClassPathResource
类路径下的资源,资源以相对于类路径的方式表示,如代码清单所示
FileSystemResource
文件系统资源,资源以文件系统路径的方式表示,如D:\Anaconda\conda-meta
InputStreamResource
对应一个InputStream的资源
ServletContextResource
为访问Web容器上下文中的资源而设计的类,负责以相对于Web应用根目录的路径加载资源,它支持以流和URL的方式访问,在WAR解包的情况下,也可以通过File的方式访问,该类还可以直接从JAR包中访问资源。
UrlResource
封装了java.net.URL,它使用户能够访问任何可以通过URL表示的资源,如文件系统的资源,HTTP资源以及FTP资源等。
有了这个抽象的资源类之后,我们就可以将Spring的配置信息放置在任何地方,只要最终可以通过Resource接口返回配置信息就可以了。
注意,Spring的Resource接口及其实现类可以在脱离Spring框架的情况下使用,它比通过JDK访问资源的API更加好用,更加强大。
假设有一个文件位于Web应用的类路径下,用户可以通过以下方式对这个文件资源进行访问:
通过FileSystemResource以文件系统的绝对路径方式进行访问;
或通过ClassPathResource以类路径的方式进行访问;
或通过ServletContextResource以相对于Web应用根目录的方式进行访问;
相对于通过JDK的File类访问文件资源的方式,Spring的Resource实现类无疑提供了更加灵活的操作方式,用户可以根据情况选择合适的Resource实现类访问资源。下面我们将分别通过FileSystemResource和ClassPathResource访问同一个文件资源。

package Resource;
import java.io.IOException;
import java.io.InputStream;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.Resource;
import java.io.IOException;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
public class FileSourceExample {
	public static void main(String[] args){
		try{
			String filePath="D:/EX/KKK.txt";
			Resource res1=new FileSystemResource(filePath);//Resource是接口,而FileSystemResource才是具体的实现类
			Resource res2=new ClassPathResource("conf/file1.txt");
			InputStream ins1=res1.getInputStream();
			InputStream ins2=res2.getInputStream();
			System.out.println("res1:"+res1.getFilename());//获取资源文件名
			System.out.println("res2:"+res2.getFilename());
		}catch(IOException e){
			e.printStackTrace();
		}
	}
}

在获取资源之后,用户就可以通过Resource接口定义的多个方法访问文件的数据和其他的信息;如可以通过getFileName()获取文件名,通过getFile()获取资源对应的File对象,通过getFile()获取资源对应的File对象,通过getInputStream()直接获取文件输入流等等。

3.资源加载接口

Spring定义了一套资源加载的接口,并提供了实现类:
在这里插入图片描述
ResourceLoader接口仅有一个getResource(String location)的方法,可以根据一个资源的地址加载文件资源,不过,资源地址仅支持带资源类型前缀的方式,不支持Ant风格的资源路径表达式。ResourcePatternResolver扩展了ResourceLoader的接口,定义了一个新的接口方法:getResources(String location)的方法,该方法支持带资源类型前缀及Ant风格的资源路径表达式。而PathMatchingResourcePatternResolver是Spring提供的标准实现类。

package Resource;

import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;
public class PatternResolverTest {
	public static void main(String[] args)throws Throwable{
		ResourcePatternResolver resolver=new PathMatchingResourcePatternResolver();
		//加载所有类包com.baobaotao下的以xml为后缀的资源
		Resource resources[]=resolver.getResources("classpath*.com/baobaotao/**/*.xml");
		for(Resource resource:resources){
			System.out.println(resource.getDescription());
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值