Spring资源抽象接口Resource

来源:互联网 发布:一加5 知乎 编辑:程序博客网 时间:2024/05/21 21:36

JDK所提供的访问资源的类(如java.net.URL、File等)不能很好的满足各种底层资源的访问需求,比如缺少从类路径或者Web容器的上下文中获取资源的操作类。为此,Spring设计了一个Resource接口,它为应用程序提供了更强的访问底层资源的能力。

先来了解一下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:/conf/bean.xml 等;
  • InputStreamResource:以输入流返回表示的资源;
  • ServletContextResource:相对于Web 应用根目录的路径加载资源,该类还可以直接从JAR 包中访问资源;
  • UrlResource:Url 封装了java.net.URL,它使用户能够访问如文件系统的资源、HTTP 资源、FTP 资源等。
使用相应的Resource接口的 实现类,就可以将Spring 的配置信息放置在任何地方,都能访问了。

为了访问不同类型的资源,必须使用相应的Resource实现类,这是比较麻烦的。是否可以在不显示使用Resource实现类的情况下,仅通过资源地址中的特殊标识就可以加载相应的资源呢?Spring提供了一个强大的资源加载机制。


其中和“classpath:”对应的,还有另一种比较难理解的“classpath*:”前缀。假设有多个JAR 包或文件系统类路径都拥有一个相同的包名(如com.baobaotao)。“classpath:”只会在第一个加载的com.baobaotao 包下查找,而“classpath*:”会到扫描所有这些JAR 包及类路径下出现的com.baobaotao 类路径。
这对于分模块打包的应用非常有用,假设一个名为baobaotao 的应用共分成3 个模块,一个模块都对应一个配置文件,分别是module1.xml,module2.xml 及module3.xml,都放到com.baobaotao 目录下,每个模块单独打JAR 包。使用“classpath*:com/baobaotao/module*.xml”将可以成功加载到这三个模块的配置文件,而使用“classpath:com/baobaotao/module*.xml”时只会加载一个模块的配置文件。


Spring定义了一套资源加载的接口,并提供了实现类。



ResourceLoader接口仅有一个getResource(String loacation)方法,可以根据一个资源地址加载文件资源。不过,资源地址仅支持带资源类型前缀的表达式,不支持Ant风格的资源路径表达式。ResourcePatternResolver扩展ResourceLoader接口,定义了一个新的接口方法getResource(String locationPattern),改方法支持带资源类型前缀及Ant风格的资源路径表达式。PathMatchingResourcePatternResolver是Spring提供的标准实现类。

ResourcePatternResolve resolver = new PathMatchingResourcePatternResolver();

Resource resources[] =resolver.getResources("classpath*:com/baobaotao/**/*.xml");
for(Resource resource:resources){
System.out.println(resource.getDescription());
}


原创粉丝点击