spring 资源访问接口

JDK提供的资源访问类,如java.net.URL、File等,不能很好地满足各种资源的访问需求,比如缺少从类路径或者Web容器的上下文中获取资源的操作类。

鉴于此,spring设计了Resource接口,该接口拥有对应不同资源类型的实现类,比如ClassPathResource以类路径的方式访问资源;ServletContextResource以相对于Web应用根目录的方式访问资源。

  1. public static void main(String[] args) throws IOException {
  2. ClassPathResource resource1 = new ClassPathResource("config/my.xml");
  3. ClassPathResource resource2 = new ClassPathResource("com/test/Driver.class");
  4. File file = resource1.getFile();
  5. System.out.println(file);
  6. file = resource2.getFile();
  7. System.out.println(file);
  8. /**
  9. * 使用Resource操作文件时,如果资源文件在jar包中,因为jar本来就是一个文件,
  10. * 所以不能使用Resource的getFile()方法获取这个文件中的文件,会抛出FileNotFoundException。
  11. * 但可以使用Resource的getInputStream()方法获取jar包中的文件。
  12. */
  13. InputStream inputStream1 = resource1.getInputStream();
  14. InputStream inputStream2 = resource2.getInputStream();
  15. }

spring资源加载接口

为了访问不同类型的资源,必须使用对应的Resource实现类;为此spring提供了资源加载机制,不再需要显示使用Resource实现类,通过资源地址的前缀自动使用不同的Resource实现,并且还支持通配符。

资源加载接口ResourceLoader采用了策略模式,可以通过传入资源地址的前缀,自动选择适合的实现类。

1、资源加载的使用

  1. import org.springframework.core.io.Resource;
  2. import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
  3. import org.springframework.core.io.support.ResourcePatternResolver;
  4.  
  5. import java.io.IOException;
  6.  
  7. public class MyTest {
  8. public static void main(String[] args) throws IOException {
  9. ResourcePatternResolver resourceLoader = new PathMatchingResourcePatternResolver();
  10. // 资源地址的前缀为classpath,所以会自动使用ClassPathResource去classpath下去访问文件
  11. Resource[] resources = resourceLoader.getResources("classpath*:*.xml");
  12. for (int i = 0; resources != null && i < resources.length; i++) {
  13. System.out.println(resources[i].getFilename());
  14. }
  15. System.out.println("方法结束");
  16. }
  17. }

a.资源地址可以使用的前缀有:1. classpath:  2. classpath*:   3.file:   4.http://    5.ftp://   6.没有前缀

b.资源地址支持三种通配符:?匹配文件名中的一个字符;* 匹配文件名中任意字符;** 匹配多层路径

c."classpath*:"和"classpath:"的区别
classpath只在本项目的classpath中寻找资源,classpath*不只在本项目的classpath中寻找资源,还会到本项目依赖的jar包里寻找资源,示例项目:https://files-cdn.cnblogs.com/files/Mike_Chang/parent.rar

2、分析资源加载机制

a、资源加载的最上层接口是ResourceLoader

  1. package org.springframework.core.io;
  2.  
  3. public interface ResourceLoader {
  4. // 根据classpath:查询资源
  5. String CLASSPATH_URL_PREFIX = "classpath:";
  6.  
  7. Resource getResource(String var1);
  8.  
  9. ClassLoader getClassLoader();
  10. }

b、ResourcePatternResolver接口扩展了

  1. package org.springframework.core.io.support;
  2.  
  3. import java.io.IOException;
  4.  
  5. import org.springframework.core.io.Resource;
  6. import org.springframework.core.io.ResourceLoader;
  7.  
  8. public interface ResourcePatternResolver extends ResourceLoader {
  9. // 根据classpath*:查询资源
  10. String CLASSPATH_ALL_URL_PREFIX = "classpath*:";
  11. // 支持通配符的资源路径表达式
  12. Resource[] getResources(String locationPattern) throws IOException;
  13. }

c.PathMatchingResourcePatternResolver是一个真正的实现类

  1. public class PathMatchingResourcePatternResolver implements ResourcePatternResolver {
  2. // 实现了上面两个接口
  3. }

spring资源访问接口和资源加载接口的更多相关文章

  1. CommonClassLoader或SharedClassLoader加载的Spring如何访问并不在其加载范围内的用户程序呢

    Question 引自<深入理解Java虚拟机—JVM高级特性与最佳实践>9.2.1,p235 如果有10个WEB应用程序都是用spring来进行组织管理的话,可以把Spring放到Com ...

  2. spring 属性文件加载接口---PropertySourceLoader

    org.springframework.boot.config Interface PropertySourceLoader 实现类: PropertiesPropertySourceLoader, ...

  3. SSH 之 Spring的源码(一)——Bean加载过程

    看看Spring的源码,看看巨人的底层实现,拓展思路,为了更好的理解原理,看看源码,深入浅出吧.本文基于Spring 4.0.8版本. 首先Web项目使用Spring是通过在web.xml里面配置 o ...

  4. Spring 系列教程之 bean 的加载

    Spring 系列教程之 bean 的加载 经过前面的分析,我们终于结束了对 XML 配置文件的解析,接下来将会面临更大的挑战,就是对 bean 加载的探索.bean 加载的功能实现远比 bean 的 ...

  5. 在Spring Boot中从类路径加载文件

    介绍 创建Spring Boot Web应用程序时,有时有时需要从类路径中加载文件:war和jar的加载文件格式是不一样的 在下面,您将找到在WAR和JAR中加载文件的解决方案. 资源加载器 使用Ja ...

  6. 【Spring MVC】Properties文件的加载

    [Spring MVC]Properties文件的加载 转载:https://www.cnblogs.com/yangchongxing/p/10726885.html 参考:https://java ...

  7. Spring框架整合WEB解决配置文件加载多次的问题

    1. 创建JavaWEB项目,引入Spring的开发包.编写具体的类和方法. * 环境搭建好后,启动服务器来测试项目,发送每访问一次都会加载一次配置文件,这样效率会非常非常慢!! 2. 解决上面的问题 ...

  8. Spring Boot 2.4 配置文件将加载机制大变化

    Spring Boot 2.4.0.M2 刚刚发布,它对 application.properties 和 application.yml 文件的加载方式进行重构.如果应用程序仅使用单个 applic ...

  9. Spring:在web.xml正确加载spring配置文件的方式

    web.xml加载spring配置文件的方式主要依据该配置文件的名称和存放的位置不同来区别,目前主要有两种方式. 1. 如果spring配置文件的名称为applicationContext.xml,并 ...

随机推荐

  1. 005. Asp.Net Routing与MVC 之三: 路由在MVC的使用

    上次讲到请求如何激活Controller和Action,这次讲下MVC中路由的使用.本次两个关注点: 遗留:ModelBinder.BindModel的过程 MVC中路由的使用 MVC 5中的Acti ...

  2. SQL 必知必会·笔记<15>创建和操纵表

    创建表的两种办法: 使用DBMS 提供的交互式创建和管理数据库表的工具: 直接用SQL 语句创建. 表创建基础 创建表示例: CREATE TABLE Products ( prod_id ) NOT ...

  3. SOA&微服务&服务网格&高可用

    SOA 架构 SOA 全称是:Service Oriented Architecture,“面向服务的架构”. 它是一种设计理念,其中包含多个服务,服务之间通过相互依赖最终提供一系列完整的功能. 各个 ...

  4. 进程间通信IPC-信号

    1,signal-ANSI C信号处理 #include <signal.h> typedef void (*sighandler_t)(int); sighandler_t signal ...

  5. checkbox在vue中的用法总结

    前言 关于checkbox多选框是再常见不过的了,几乎很多地方都会用到,这两天在使用vue框架时需要用到checkbox多选功能,实在着实让我头疼,vue和原生checkbox用法不太一样, 之前对于 ...

  6. 类Exception_A继承Exception,类Exception_B继承Exception_A,请问执行此段代码的输出是什么?

    @Test public void Test_Exception() { try { throw new ExceptionB("A"); } catch (ExceptionA ...

  7. 作用域public、private、protected、以及不写时的区别?

    区别如下: 作用域 当前类 同包 子孙类 其他 public     √ √ √ √ protected   √ √ √ X default    √  √ X X private    √  X X ...

  8. ASP .NET MVC HtmlHelper扩展——简化“列表控件”的绑定

    在众多表单元素中,有一类<select>元素用于绑定一组预定义列表.传统的ASP.NET Web Form中,它对应着一组重要的控件类型,即ListControl,我们经常用到DropDo ...

  9. TCP/IP 详解

    分层 每一层负责不同的功能:     链路层 有时也称作数据链路层或网络接口层, 通常包括操作系统中的设备驱动程序和计算机 中对应的网络接口卡.它们一起处理与电缆(或其他任何传输媒介)的物理接口细节. ...

  10. [PHP] 算法-二叉树的子结构判断的PHP实现

    输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 1.子树的意思是包含了一个节点,就得包含这个节点下的所有节点,两棵树同时到底 2.子结构可以是A树的任意一部 ...