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. 经典qq表情插件(html+nodejs应用)

    由于目前在接触聊天室项目,接到一个需求实现一个类似QQ表情.在网上找了一款jquery经典表情插件.下面介绍一个用法: HTML: 首先在html页面的head中引入jQuery库文件和QQ表情插件j ...

  2. centos7防火墙管理的变化

    当我们在centos7中输入service iptables status 查看系统的防火墙状态,会出现如下错误: 网上查阅才知道centos7的防火墙管理工具变了,原来的iptables已经不用了, ...

  3. Python--Click

    Click Click 是 Flask 的开发团队 Pallets 的另一款开源项目,它是用于快速创建命令行的第三方模块. 我们知道,Python 内置了一个 Argparse 的标准库用于创建命令行 ...

  4. 脚手架vue-cli系列二:vue-cli的工程模板与构建工具

    上篇文章我们提到了vue-cli的工程模板.这里我们来详细的进行介绍. vue-cli提供的脚手架只是一个最基础的,也可以说是Vue团队认为的工程结构的一种最佳实践.对于初学者或者以前曾从事Angul ...

  5. [EXP]Apache Spark - Unauthenticated Command Execution (Metasploit)

    ## # This module requires Metasploit: https://metasploit.com/download # Current source: https://gith ...

  6. [视频]K8飞刀 S2-020 exploit getshell 动画教程

    [视频]K8飞刀 S2-020 exploit getshell 动画教程 链接:https://pan.baidu.com/s/1G5x7Dcu6pzHz6ZfSCDDmKA 提取码:05kw

  7. Linux编程 1 (文件系统路径说明, 目录结构说明)

    一. Linux文件系统路径说明 熟悉windows系统的,都知道文件路径表示,如C:\User\rich\Documnets\test.doc. 在linux中目录称为虚拟目录(virtual di ...

  8. mongodb数据库添加权限及简单数据库命令操作笔记

    加固mongodb建议:修改数据库默认端口,添加数据库访问权限: 启动数据库(裸奔):C:\mongodb\bin>mongod --dbpath C:\MongoDB\data(同时用--db ...

  9. 交换路由中期测验20181226(动态路由配置与重分发、NAT转换、ACL访问控制列表)

    测试拓扑: 接口配置信息 HostName 接口 IP地址 网关 Server 0 Fa0 172.16.15.1/24 172.16.15.254 Server 1 Fa0 100.2.15.200 ...

  10. 【随笔】nginx add_header指令的使用

    nginx配置文件通过使用add_header指令来设置response header. 具体方法如下: add_header key value add_header Cache-Control n ...