spring 资源访问接口

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

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

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

spring资源加载接口

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

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

1、资源加载的使用

import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;

import java.io.IOException;

public class MyTest {
    public static void main(String[] args) throws IOException {
        ResourcePatternResolver resourceLoader = new PathMatchingResourcePatternResolver();
        // 资源地址的前缀为classpath,所以会自动使用ClassPathResource去classpath下去访问文件
        Resource[] resources = resourceLoader.getResources("classpath*:*.xml");
        for (int i = 0; resources != null && i < resources.length; i++) {
            System.out.println(resources[i].getFilename());
        }
        System.out.println("方法结束");
    }
}

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

package org.springframework.core.io;

public interface ResourceLoader {
    // 根据classpath:查询资源
    String CLASSPATH_URL_PREFIX = "classpath:";

    Resource getResource(String var1);

    ClassLoader getClassLoader();
}

b、ResourcePatternResolver接口扩展了

package org.springframework.core.io.support;

import java.io.IOException;

import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;

public interface ResourcePatternResolver extends ResourceLoader {
    // 根据classpath*:查询资源
    String CLASSPATH_ALL_URL_PREFIX = "classpath*:";
    // 支持通配符的资源路径表达式
    Resource[] getResources(String locationPattern) throws IOException;
}

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

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

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. JS特效实现微博评论逻辑

    实现代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...

  2. 13-02 Java 数组高级算法,Arrays类

    冒泡排序 冒泡排序原理 冒泡排序代码: package cn.itcast_01; /* * 数组排序之冒泡排序: * 相邻元素两两比较,大的往后放,第一次完毕,最大值出现在了最大索引处 */ pub ...

  3. 什么是js的严格模式

    设立严格模式的原因: - 消除Javascript语法的一些不合理.不严谨之处,减少一些怪异行为; - 消除代码运行的一些不安全之处,保证代码运行的安全: - 提高编译器效率,增加运行速度: - 为未 ...

  4. Django--模板层template

    一 模版简介 你可能已经注意到我们在例子视图中返回文本的方式有点特别. 也就是说,HTML被直接硬编码在 Python代码之中. def current_datetime(request): now ...

  5. java反转链表

    /** * 遍历,将当前节点的下一个节点缓存后更改当前节点指针 */ public static Node reverse2(Node head) { if (head == null) return ...

  6. .Net Core项目添加日志功能

    一.微软内置的日志组件 在.Net Core中使用模板新建的Web Api项目时,会自动加入日志功能.只需要在控制器中注入ILogger就可以了.命名空间为:Microsoft.Extensions. ...

  7. 分布式计算框架Spark

    Apache Spark是一个开源分布式运算框架,最初是由加州大学柏克莱分校AMPLab所开发. Hadoop MapReduce的每一步完成必须将数据序列化写到分布式文件系统导致效率大幅降低.Spa ...

  8. PowerDesigner反向生成物理数据模型

    什么是PowerDesigner Power Designer 是Sybase公司的CASE工具集,使用它可以方便地对管理信息系统进行分析设计,它几乎包括了数据库模型设计的全过程.利用Power De ...

  9. cocoapods使用-库托管到svn或者github

    下拉svn库(自定义库或者第三方库)到工程中:   1. 若未安装,请安装cocoapods:    http://www.cnblogs.com/sunjianfei/p/6089231.html ...

  10. Docker 安装MySQL5.7(三)

    Docker 安装MySQL5.7 1.搜索docker镜像(可以看到搜索的结果,这个结果是按照一定的星级评价规则排序的) docker search mysql 2.拉取docker的mysql镜像 ...