Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >spring 之资源操作:Resources

spring 之资源操作:Resources

作者头像
叫我阿杰好了
发布于 2024-01-03 01:26:55
发布于 2024-01-03 01:26:55
21300
代码可运行
举报
运行总次数:0
代码可运行

1、Spring Resources概述

Java 编程中,java.net.URL 类常用于进行资源操作。然而,这个类在访问某些底层资源时存在局限性。例如,它不能直接从类路径中获取资源,或者在 Web 项目中无法方便地访问相对于服务器上下文的资源。此外,java.net.URL 在功能方面也有所欠缺,比如无法检测某个资源是否存在。

针对这些限制,Spring 框架提供了 Resource 接口。Resource 接口为底层资源的访问提供了更强大的能力。它不仅可以处理来自类路径的资源和相对于服务器上下文的资源,还包含了一些额外的实用功能,如资源存在性的检测。因此,对于需要进行细致的资源管理和访问的情况,选择 Spring 的 Resource 接口通常是更优的选择。这种设计不仅增强了资源访问的灵活性,也提升了开发效率和代码的可维护性。

2、Resource接口

Spring 的 Resource 接口位于 org.springframework.core.io 中。 旨在成为一个更强大的接口,用于抽象对低级资源的访问。以下显示了Resource接口定义的方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public interface Resource extends InputStreamSource {

    /**
     * 判断资源是否物理存在。
     * 这个方法进行确切的存在性检查,而资源的存在只保证了有效的描述符。
     */
    boolean exists();

    /**
     * 指示是否可以通过 {@link #getInputStream()} 读取此资源的非空内容。
     * 通常对于存在的典型资源描述符,返回 {@code true},因为它严格隐含了 {@link #exists()} 的语义。
     * 注意,实际的内容读取可能仍然会失败。然而,{@code false} 明确指出资源内容无法读取。
     */
    default boolean isReadable() {
        return exists();
    }

    /**
     * 指示此资源是否代表一个开放的流句柄。
     * 如果为 {@code true},InputStream 不能被多次读取,并且必须在读取后及时关闭以避免资源泄漏。
     * 对于典型的资源描述符,这将是 {@code false}。
     */
    default boolean isOpen() {
        return false;
    }

    /**
     * 判断此资源是否代表文件系统中的一个文件。
     * {@code true} 值强烈暗示(但不保证){@link #getFile()} 调用会成功。
     * 默认情况下,这是保守地设置为 {@code false}。
     */
    default boolean isFile() {
        return false;
    }

    /**
     * 返回此资源的 URL 句柄。
     * @throws IOException 如果资源无法作为 URL 解析,即如果资源作为描述符不可用。
     */
    URL getURL() throws IOException;

    /**
     * 返回此资源的 URI 句柄。
     * @throws IOException 如果资源无法作为 URI 解析,即如果资源作为描述符不可用。
     */
    URI getURI() throws IOException;

    /**
     * 返回此资源的文件句柄。
     * @throws java.io.FileNotFoundException 如果资源无法解析为绝对文件路径,即如果资源在文件系统中不可用。
     * @throws IOException 如果在解析/读取时发生一般性故障。
     */
    File getFile() throws IOException;

    /**
     * 返回一个 {@link ReadableByteChannel}。
     * 预期每次调用都会创建一个新的通道。
     * 默认实现通过 {@link #getInputStream()} 的结果返回 {@link Channels#newChannel(InputStream)}。
     * @return 此资源底层的字节通道(不能为空)。
     * @throws java.io.FileNotFoundException 如果底层资源不存在。
     * @throws IOException 如果无法打开内容通道。
     */
    default ReadableByteChannel readableChannel() throws IOException {
        return Channels.newChannel(getInputStream());
    }

    /**
     * 将此资源的内容作为字节数组返回。
     * @return 此资源的内容作为字节数组。
     * @throws java.io.FileNotFoundException 如果资源无法解析为绝对文件路径,即如果资源在文件系统中不可用。
     * @throws IOException 如果在解析/读取时发生一般性故障。
     */
    default byte[] getContentAsByteArray() throws IOException {
        return FileCopyUtils.copyToByteArray(getInputStream());
    }

    /**
     * 使用指定的字符集,将此资源的内容作为字符串返回。
     * @param charset 用于解码的字符集。
     * @return 此资源的内容作为一个 {@code String}。
     * @throws java.io.FileNotFoundException 如果资源无法解析为绝对文件路径,即如果资源在文件系统中不可用。
     * @throws IOException 如果在解析/读取时发生一般性故障。
     */
    default String getContentAsString(Charset charset) throws IOException {
        return FileCopyUtils.copyToString(new InputStreamReader(getInputStream(), charset));
    }

    /**
     * 确定此资源的内容长度。
     * @throws IOException 如果无法解析资源(在文件系统或作为其他已知的物理资源类型)。
     */
    long contentLength() throws IOException;

    /**
     * 确定此资源最后修改的时间戳。
     * @throws IOException 如果无法解析资源(在文件系统或作为其他已知的物理资源类型)。
     */
    long lastModified() throws IOException;

    /**
     * 创建相对于此资源的相对路径资源。
     * @param relativePath 相对于此资源的相对路径。
     * @return 相对资源的资源句柄。
     * @throws IOException 如果无法确定相对资源。
     */
    Resource createRelative(String relativePath) throws IOException;

    /**
     * 确定此资源的文件名 - 通常是路径的最后一部分 - 例如,{@code "myfile.txt"}。
     * 如果此类资源没有文件名,则返回 {@code null}。
     * 鼓励实现返回未编码的文件名。
     */
    @Nullable
    String getFilename();

    /**
     * 返回此资源的描述,用于在使用资源时输出错误信息。
     * 鼓励实现也从他们的 {@code toString} 方法返回这个值。
     * @see Object#toString()
     */
    String getDescription();

}

另外它继承这个接口中有一个方法叫getInputStream,这个方法能实现对低级别资源的访问

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public interface InputStreamSource {

    InputStream getInputStream() throws IOException;

}

3 Resource的实现类

因为Resource是一个接口或者说是一个抽象,它本身并不提供资源的访问实现,所以它有很多的实现类。我们用的话就用这个resource接口中的各个实现类。

3.1 UrlResource 访问网络资源

首先我们来看第一个实现类:UrlResource。

它Resource的一个实现类,用来访问网络资源,它支持URL的绝对路径。

http:------该前缀用于访问基于HTTP协议的网络资源。 ftp:------该前缀用于访问基于FTP协议的网络资源 file: ------该前缀用于从文件系统中读取资源

接下来我们来做一个演示,访问基于HTTP协议的网络资源

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import org.springframework.core.io.UrlResource;

/**
 * UrlResource访问资源
 *
 * @author 阿杰 2416338031@qq.com
 * @version 1.0
 * @date 2024/1/2 7:13
 */
public class UrlResourceTest {

    /**
     * 通过UrlResource访问网络资源
     *
     * @param path 资源路径
     */
    public static void loadAndReadUrlResource(String path) {
        // 创建一个 Resource 对象
        UrlResource url = null;
        try {
            url = new UrlResource(path);
            // 获取资源名
            System.out.println("资源名:" + url.getFilename());
            System.out.println("资源路径:" + url.getURL());
            // 获取资源描述
            System.out.println("资源描述:" + url.getDescription());
            //获取资源内容
            System.out.println("资源内容:" + url.getInputStream().read());
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    public static void main(String[] args) {
        loadAndReadUrlResource("https://www.baidu.com");
    }

}

第二个我们演示如何获取项目根路径下的文件,也就是从文件系统中读取资源。

当然我们也可以使用文件的绝对路径。

3.2 ClassPathResource 访问类路径下资源

ClassPathResource 用来访问类加载路径下的资源,相对于其他的 Resource 实现类,其主要优势是方便访问类加载路径里的资源,尤其对于 Web 应用,ClassPathResource 可自动搜索位于 classes 下的资源文件,无须使用绝对路径访问。

那我们就来演示 在类路径下创建文件,使用ClassPathResource 访问

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import org.springframework.core.io.ClassPathResource;

import java.io.InputStream;

/**
 * 访问类路径下的资源演示
 *
 * @author 阿杰 2416338031@qq.com
 * @version 1.0
 * @date 2024/1/2 7:31
 */
public class ClassPathResourceTest {

    /**
     * 通过ClassPathResource访问类路径下的资源
     *
     * @param path 资源路径
     */
    public static void loadAndReadUrlResource(String path) throws Exception {
        // 创建一个 Resource 对象
        ClassPathResource resource = new ClassPathResource(path);
        // 获取文件名
        System.out.println("resource.getFileName = " + resource.getFilename());
        // 获取文件描述
        System.out.println("resource.getDescription = " + resource.getDescription());
        //获取文件内容
        InputStream in = resource.getInputStream();
        byte[] b = new byte[1024];
        while (in.read(b) != -1) {
            System.out.println(new String(b));
        }
    }

    public static void main(String[] args) throws Exception {
        loadAndReadUrlResource("提示词.txt");
    }
}

3.3 FileSystemResource 访问文件系统资源

Spring 提供的 FileSystemResource 类用于访问文件系统资源,使用 FileSystemResource 来访问文件系统资源并没有太大的优势,因为 Java 提供的 File 类也可用于访问文件系统资源。

演示 使用FileSystemResource 访问文件系统资源

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import org.springframework.core.io.FileSystemResource;

import java.io.InputStream;

/**
 *  使用FileSystemResource 访问文件系统资源
 *
 * @author 阿杰 2416338031@qq.com
 * @version 1.0
 * @date 2024/1/2 7:38
 */
public class FileSystemResourceTest {


    /**
     * 通过FileSystemResource访问文件系统资源
     *
     * @param path 资源路径
     */
    public static void loadAndReadUrlResource(String path) throws Exception{
        FileSystemResource resource = new FileSystemResource(path);
        // 获取文件名
        System.out.println("resource.getFileName = " + resource.getFilename());
        // 获取文件描述
        System.out.println("resource.getDescription = "+ resource.getDescription());
        //获取文件内容
        InputStream in = resource.getInputStream();
        byte[] b = new byte[1024];
        while(in.read(b)!=-1) {
            System.out.println(new String(b));
        }
    }

    public static void main(String[] args) throws Exception {
        // 访问文件系统资源 相对路径
        loadAndReadUrlResource("pom.xml");

        // 访问文件系统资源 绝对路径
        loadAndReadUrlResource("D:\\code\\Java\\spring6-learning-project\\pom.xml");
    }
}

4、Resource类图

上述Resource实现类与Resource顶级接口之间的关系可以用下面的UML关系模型来表示

5、ResourceLoader 接口

5.1 概述

Spring 提供了两个关键的接口来处理资源加载:

1. ResourceLoader接口: ResourceLoader接口的实现类可以获取资源的Resource实例。它是用于加载不同类型资源的抽象接口,提供了一种统一的方式来访问各种资源,如文件、类路径资源、URL等。通过ResourceLoader,可以轻松地获取和操作应用程序中的资源。

2. ResourceLoaderAware接口: 实现了ResourceLoaderAware接口的类实例将获得对ResourceLoader的引用。这意味着它们可以在运行时通过ResourceLoader来访问资源。这对于将资源加载能力注入到特定的类中非常有用,使它们能够以一种更灵活的方式处理资源。

ResourceLoader接口提供了一个主要方法:

Resource getResource(String location):这个方法用于根据资源位置获取Resource实例。Resource可以表示各种资源,例如文件、URL、类路径资源等。ApplicationContextResourceLoader接口的常见实现之一,因此它可以直接用于获取Resource实例。

5.2 使用演示

实验一:ClassPathXmlApplicationContext获取Resource实例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.core.io.Resource;

public class ResourceExample {
    public static void main(String[] args) {
        // 访问类路径下的资源
        ApplicationContext ctx = new ClassPathXmlApplicationContext();
        // 获取类路径下的资源
        Resource res = ctx.getResource("提示词.txt");
        // 输出资源信息
        System.out.println(res.getFilename());
    }
}

实验二:FileSystemApplicationContext获取Resource实例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
import org.springframework.core.io.Resource;

public class ResourceExample {
    public static void main(String[] args) {
        // 访问类路径下的资源
        ApplicationContext ctx = new FileSystemXmlApplicationContext();
        // 获取类路径下的资源
        Resource res = ctx.getResource("提示词.txt");
        // 输出资源信息
        System.out.println(res.getFilename());
    }
}

5.3 ResourceLoader 总结

Spring采用与ApplicationContext相同的策略来访问资源。

也就是说,如果ApplicationContextFileSystemXmlApplicationContext,res就是FileSystemResource实例;

如果ApplicationContextClassPathXmlApplicationContext,res就是ClassPathResource实例。

当Spring应用程序需要进行资源访问时,实际上不需要直接使用Resource实现类,而是调用ResourceLoader实例的getResource()方法来获取资源。ResourceLoader将负责选择Resource实现类,也就是确定具体的资源访问策略,从而将应用程序和具体的资源访问策略分离开来。

此外,使用ApplicationContext访问资源时,可以通过不同的前缀来强制使用指定的ClassPathResourceFileSystemResource等实现类。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Resource res = ctx.getResource("classpath:bean.xml");
Resource res = ctx.getResource("file:bean.xml");
Resource res = ctx.getResource("http://localhost:8080/beans.xml");

6、ResourceLoaderAware 接口

ResourceLoaderAware接口的实现类的实例将获得一个ResourceLoader的引用。ResourceLoaderAware接口提供了一个setResourceLoader()方法,该方法会被Spring容器负责调用。Spring容器会将一个ResourceLoader对象作为该方法的参数传入。

如果将实现ResourceLoaderAware接口的Bean类部署在Spring容器中,Spring容器会将自身作为ResourceLoader对象传递给setResourceLoader()方法。这意味着在Bean中可以使用该ResourceLoader对象来加载资源,因为ApplicationContext的实现类通常都实现了ResourceLoader接口,所以Spring容器本身可以用作ResourceLoader

解释一下:

ResourceLoaderAware接口的实现类将会获得一个ResourceLoader引用。例如,如果您编写了一个类并实现了ResourceLoaderAware接口,然后将这个类部署到Spring容器中,Spring容器可以将自身作为ResourceLoader对象传递给这个类。 由于ApplicationContext的实现类通常也实现了ResourceLoader接口,所以Spring容器本身完全可以作为ResourceLoader进行使用。这意味着您可以在Bean中使用Spring容器来加载和访问资源,从而使资源加载更加灵活和方便。

实验:演示ResourceLoaderAware使用

第一步 创建类,实现ResourceLoaderAware接口

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.jie.resource;


import org.springframework.context.ResourceLoaderAware;
import org.springframework.core.io.ResourceLoader;

/**
 * 实现ResourceLoaderAware接口,获取ResourceLoader对象
 *
 * @author 阿杰 2416338031@qq.com
 * @version 1.0
 * @date 2024/1/2 20:52
 */
public class TestBean implements ResourceLoaderAware {

    /**
     * ResourceLoader对象
     */
    private ResourceLoader resourceLoader;

    /**
     * 实现ResourceLoaderAware接口必须实现的方法
     * 如果把该Bean部署在Spring容器中,该方法将会有Spring容器负责调用。
     * SPring容器调用该方法时,Spring会将自身作为参数传给该方法。
     *
     * @param resourceLoader ResourceLoader对象
     */
    public void setResourceLoader(ResourceLoader resourceLoader) {
        // 将ResourceLoader对象保存起来
        this.resourceLoader = resourceLoader;
    }

    /**
     * 获取ResourceLoader对象
     *
     * @return ResourceLoader对象
     */
    public ResourceLoader getResourceLoader() {
        // 返回ResourceLoader对象
        return this.resourceLoader;
    }
}

第二步 创建bean.xml文件,配置TestBean

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!-- 通过classpath:来指定资源的位置 -->
    <bean id="testBean" class="com.jie.resource.TestBean"/>
</beans>

第三步 测试

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import com.jie.resource.TestBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;

public class ResourceExample {
    public static void main(String[] args) {
        // Spring容器会将一个ResourceLoader对象作为该方法的参数传入
        ApplicationContext ctx = new ClassPathXmlApplicationContext("bean.xml");
        // 获取TestBean对象
        TestBean testBean = ctx.getBean("testBean", TestBean.class);
        // 获取ResourceLoader对象
        ResourceLoader resourceLoader = testBean.getResourceLoader();
        // 判断ResourceLoader对象是否是Spring容器本身
        System.out.println("Spring容器将自身注入到ResourceLoaderAware Bean 中 ? :" + (resourceLoader == ctx));
        // 获取Resource对象
        Resource resource = resourceLoader.getResource("提示词.txt");
        // 输出Resource对象的文件名
        System.out.println(resource.getFilename());
        // 输出Resource对象的描述信息
        System.out.println(resource.getDescription());
    }
}

7、使用Resource作为属性

在前面的部分,我们介绍了Spring提供的资源访问策略,这些策略通常要求我们要么使用Resource实现类,要么使用ApplicationContext来获取资源。然而,在实际应用中,当Bean实例需要访问资源时,Spring提供了更加方便的解决方案:直接利用依赖注入。从这个角度来看,Spring框架充分利用了策略模式来简化资源访问,并将策略模式与控制反转(IoC)有机结合,最大程度地简化了Spring资源访问的流程。

总结起来,如果一个Bean实例需要访问资源,通常有以下两种解决方案:

  1. 在代码中获取Resource实例: 这种方式需要在程序中明确提供资源的位置信息,无论是通过FileSystemResource创建实例、通过ClassPathResource创建实例,还是通过ApplicationContextgetResource()方法获取实例,都需要提供资源的位置信息。这意味着资源的物理位置与代码耦合在一起,如果资源位置发生改变,就需要修改代码。因此,这种方式通常用于少数情况下需要动态决定资源位置的情况。
  2. 使用依赖注入: 这是更推荐的方式。通过依赖注入,Spring可以将资源注入到Bean实例中,而不需要在代码中硬编码资源的位置。这种方式使得代码更加松耦合,更容易维护和测试。无论资源的位置如何变化,只需要调整配置而不是修改代码即可。

因此,通常建议使用依赖注入的方式,让Spring为Bean实例注入所需的资源,以提高应用程序的可维护性和灵活性。

实验:让Spring为Bean实例依赖注入资源

第一步 创建依赖注入类,定义属性和方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.jie.resource;

import org.springframework.core.io.Resource;

/**
 * ResourceBean
 *
 * @author 阿杰 2416338031@qq.com
 * @version 1.0
 * @date 2024/1/2 21:03
 */
public class ResourceBean {


    /**
     * Resource对象
     */
    private Resource res;

    /**
     * 设置Resource对象
     *
     * @param res Resource对象
     */
    public void setRes(Resource res) {
        this.res = res;
    }

    /**
     * 获取Resource对象
     *
     * @return Resource对象
     */
    public Resource getRes() {
        return res;
    }

    /**
     * 解析Resource对象
     */
    public void parse() {
        System.out.println(res.getFilename());
        System.out.println(res.getDescription());
    }
}

第二步 创建spring配置文件,配置依赖注入

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!-- 通过classpath:来指定资源的位置 -->
    <bean id="resourceBean" class="com.jie.resource.ResourceBean">
        <!-- 可以使用file:、http:、ftp:等前缀强制Spring采用对应的资源访问策略 -->
        <!-- 如果不采用任何前缀,则Spring将采用与该ApplicationContext相同的资源访问策略来访问资源 -->
        <property name="res" value="classpath:提示词.txt"/>
    </bean>
</beans>

第三步 测试

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import com.jie.resource.ResourceBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class ResourceExample {
    public static void main(String[] args) {
        // 通过类路径加载配置文件
        ApplicationContext ctx = new ClassPathXmlApplicationContext("bean2.xml");
        // 获取ResourceBean对象
        ResourceBean resourceBean = ctx.getBean("resourceBean", ResourceBean.class);
        // 调用ResourceBean的parse方法
        resourceBean.parse();
    }
}

8、应用程序上下文和资源路径

8.1 概述

无论以何种方式创建ApplicationContext实例,都需要为ApplicationContext指定配置文件。Spring允许使用一个或多个XML配置文件来配置应用程序上下文。当程序创建ApplicationContext实例时,通常也是通过Resource的方式来访问这些配置文件。因此,ApplicationContext完全支持不同类型的资源访问方式,包括ClassPathResource、FileSystemResource、ServletContextResource等。

ApplicationContext确定资源访问策略通常有两种方法:

(1)使用ApplicationContext实现类指定访问策略。

(2)使用前缀指定访问策略。

8.2 ApplicationContext实现类指定访问策略

创建ApplicationContext对象时,通常可以使用以下不同的实现类:

  1. ClassPathXMLApplicationContext 对应使用ClassPathResource进行资源访问。
  2. FileSystemXmlApplicationContext 对应使用FileSystemResource进行资源访问。
  3. XmlWebApplicationContext 对应使用ServletContextResource进行资源访问。

当使用不同的ApplicationContext实现类时,意味着Spring将采用相应的资源访问策略。

前面已经演示了相关示例来展示不同ApplicationContext实现类的效果。

8.3 使用前缀指定访问策略

实验一:classpath前缀使用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.atguigu.spring6.context;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.core.io.Resource;

public class Demo1 {

    public static void main(String[] args) {
        /*
         * 通过搜索文件系统路径下的xml文件创建ApplicationContext,
         * 但通过指定classpath:前缀强制搜索类加载路径
         * classpath:bean.xml
         * */
        ApplicationContext ctx =
                new ClassPathXmlApplicationContext("classpath:bean.xml");
        System.out.println(ctx);
        Resource resource = ctx.getResource("atguigu.txt");
        System.out.println(resource.getFilename());
        System.out.println(resource.getDescription());
    }
}

实验二:classpath通配符使用

classpath* : 前缀允许加载多个XML配置文件的能力。当使用classpath*:前缀指定XML配置文件时,系统将搜索类加载路径下所有与文件名匹配的文件,并分别加载这些文件中的配置定义,最后将它们合并成一个ApplicationContext。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath*:bean.xml");
System.out.println(ctx);

使用classpath* : 前缀时,Spring会搜索类加载路径下所有符合条件的配置文件。

需要注意的是,classpath* : 前缀仅对ApplicationContext有效,因为创建ApplicationContext时会分别访问多个配置文件,而不是像Resource一样使用ClassLoader的getResource方法。

使用三:通配符其他使用

一次性加载多个配置文件的方式是通过通配符来指定配置文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:bean*.xml");

Spring也允许将classpath* : 前缀与通配符结合使用:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath*:bean*.xml");
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-01-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Spring Resources资源操作
Java的标准java.net.URL类和各种URL前缀的标准处理程序无法满足所有对low-level资源的访问,比如:没有标准化的 URL 实现可用于访问需要从类路径或相对于 ServletContext 获取的资源。并且缺少某些Spring所需要的功能,例如检测某资源是否存在等。而Spring的Resource声明了访问low-level资源的能力。
鱼找水需要时间
2023/06/15
3030
Spring Resources资源操作
【Spring】资源操作管理:Resource、ResourceLoader、ResourceLoaderAware;
Spring 的 Resource 接口位于 org.springframework.core.io 中。 旨在成为一个更强大的接口,用于抽象对低级资源的访问。以下显示了Resource接口定义的方法
.29.
2023/10/17
5870
【Spring】资源操作管理:Resource、ResourceLoader、ResourceLoaderAware;
Spring6reRescourse资源的使用及Spring6国际化
Java的标准java.net.URL类和各种URL前缀的标准处理程序无法满足所有对low-level资源的访问,比如:没有标准化的 URL 实现可用于访问需要从类路径或相对于 ServletContext 获取的资源。并且缺少某些Spring所需要的功能,例如检测某资源是否存在等。而Spring的Resource声明了访问low-level资源的能力。
小小程序员
2023/03/27
4940
Spring6reRescourse资源的使用及Spring6国际化
Resource 体系介绍
在使用spring作为容器进行项目开发中会有很多的配置文件,这些配置文件都是通过Spring的Resource接口来实现加载,但是,Resource对于所有低级资源的访问都不够充分。例如,没有标准化的URL实现可用于访问需要从类路径或相对于ServletContext获取的资源。虽然可以为专用的URL前缀注册新的处理程序(类似于http :)这样的前缀的现有处理程序,但这通常非常复杂,并且URL接口仍然缺少一些理想的功能,例如检查存在的方法被指向的资源。
cxuan
2019/06/17
1.3K0
Spring5参考指南: Resources
Spring定义了Resource接口用来对资源的访问,一般来说资源有两种形式,一种是URL的形式从外部链接加载,一种是File的形式从系统本身查找。
程序那些事
2020/07/08
7200
Spring复杂的BeanFactory继承体系该如何理解?---中下
作为Spring提供的较之BeanFactory更为先进的IoC容器实现,ApplicationContext除了拥有BeanFactory支持的所有功能之外,还进一步扩展了基本容器的功能,包括BeanFactoryPostProcessor、BeanPostProcessor以及其他特殊类型bean的自动识别、容器启动后bean实例的自动初始化、国际化的信息支持、容器内事件发布等。真是“青出于蓝而胜于蓝”啊!
大忽悠爱学习
2022/05/10
4070
Spring复杂的BeanFactory继承体系该如何理解?---中下
Spring核心——资源管理 原
对于一个联机事务型系统(业务系统)来说,所依赖的外部运行信息主要有2个来源:数据项和资源项。数据项的存放位置通常是使用各种关系性或NoSql数据库,而资源项通常是使用文件、网络信息的方式来存储。
随风溜达的向日葵
2018/08/15
4760
【小家Spring】资源访问利器---Spring使用ResourceLoader接口便捷的获取资源(ResourcePatternResolver、ResourceLoaderAware)
关于Spring Framework中资源的访问,上篇已经讲解了org.springframework.core.io.Resource接口,它有非常多的实现类,来针对不同的场景去规范统一的资源获取方式。 【小家Spring】资源访问利器—Spring提供的Resource接口以及它的常用子类源码分析
YourBatman
2019/09/03
2.5K0
【小家Spring】资源访问利器---Spring使用ResourceLoader接口便捷的获取资源(ResourcePatternResolver、ResourceLoaderAware)
Spring系列八:Spring 中读取文件-ResourceLoaderAware
本文将了解资源或文件(例如文本文件、XML文件、属性文件或图像文件)加载到Spring应用程序上下文中的不同实现。Spring ResourceLoader为我们提供了一个统一的getResource()方法来通过资源路径检索外部资源。
java干货
2021/02/19
8280
Spring系列八:Spring 中读取文件-ResourceLoaderAware
Java-利用Spring提供的Resource/ResourceLoader接口操作资源文件
JDK提供的访问资源的类(如java.net.URL、File等)并不能很好地满足各种底层资源的访问需求,比如缺少从类路径或者Web容器上下文中获取资源的操作类。
小小工匠
2021/08/16
1.7K0
Spring中的资源加载策略
Resouce接口可以根据资源的不同类型,或者资源位置的不同,给出对应的具体实现,Spring框架提供了一些实现类:
阿杜
2018/08/06
6340
Spring中的资源加载策略
Spring框架源码分析(IoC):Resource、ResourceLoader和容器之间的关系
Resource接口定义了资源常见的操作,抽象出了一些通用方法,再由不同的实现类去自定义。直接上Resource源码:
星如月勿忘初心
2020/08/01
1.3K0
Spring框架源码分析(IoC):Resource、ResourceLoader和容器之间的关系
【死磕 Spring】----- IOC 之 Spring 统一资源加载策略
在学 Java SE 的时候我们学习了一个标准类 java.net.URL,该类在 Java SE 中的定位为统一资源定位器(Uniform Resource Locator),但是我们知道它的实现基本只限于网络形式发布的资源的查找和定位。然而,实际上资源的定义比较广泛,除了网络形式的资源,还有以二进制形式存在的、以文件形式存在的、以字节流形式存在的等等。而且它可以存在于任何场所,比如网络、文件系统、应用程序中。所以 java.net.URL 的局限性迫使 Spring 必须实现自己的资源加载策略,该资源加载策略需要满足如下要求:
用户1655470
2018/09/30
7760
【死磕 Spring】----- IOC 之 Spring 统一资源加载策略
Spring5源码解析_IOC之容器的基本实现
Bean是Spring最核心的东西,Spring就像是一个大水桶,而Bean就是水桶中的水,水桶脱离了水就没有了什么用处,我们简单看一下Bean的定义,代码如下:
@派大星
2023/06/28
2130
Spring5源码解析_IOC之容器的基本实现
深入理解Spring中的Resource资源管理
pring中的Resource(资源)是一个抽象接口,用于表示应用程序中的各种资源,如文件、类路径资源、URL等。它提供了统一的方式来访问这些资源,无论资源位于何处,都可以通过Resource接口进行操作。Spring的Resource接口具有灵活性和可扩展性,使开发人员可以方便地加载、读取和处理各种资源,这在配置文件、模板加载和资源管理方面特别有用。这些资源可以是静态文件、动态生成的内容或外部文件等,Resource接口为访问它们提供了一致的抽象。
杨不易呀
2023/09/26
9311
深入理解Spring中的Resource资源管理
手撸Spring框架,设计与实现资源加载器,从Spring.xml解析和注册Bean对象
接,是能接的,接几次也行,哪怕就一个类一片的 if...else 也可以!但接完成什么样可就不一定了,会不会出事故也不是能控制住的。
小傅哥
2021/06/10
5380
手撸Spring框架,设计与实现资源加载器,从Spring.xml解析和注册Bean对象
《Spring 手撸专栏》第 6 章:气吞山河,设计与实现资源加载器,从Spring.xml解析和注册Bean对象
接,是能接的,接几次也行,哪怕就一个类一片的 if...else 也可以!但接完成什么样可就不一定了,会不会出事故也不是能控制住的。
小傅哥
2021/06/25
4440
《Spring 手撸专栏》第 6 章:气吞山河,设计与实现资源加载器,从Spring.xml解析和注册Bean对象
【小家Spring】资源访问利器---Spring提供的Resource接口以及它的常用子类源码分析
资源是一个抽象的概念,什么是资源?我们已知Spring中有很多xml配置文件,同时还可能自建各种properties资源文件,还有可能进行网络交互,收发各种文件、二进制流等。
YourBatman
2019/09/03
1.6K0
【小家Spring】资源访问利器---Spring提供的Resource接口以及它的常用子类源码分析
SpringBoot: ResourceLoaderAware读取外部文件
Spring ResourceLoader为我们提供了一个统一的getResource()方法来通过资源路径检索外部资源。从而将资源或文件(例如文本文件、XML文件、属性文件或图像文件)加载到Spring应用程序上下文中的不同实现
Freedom123
2024/03/29
2630
SpringBoot: ResourceLoaderAware读取外部文件
Spring入门:Resource
然而,用 Java 的 File、URL 访问这些底层资源的步骤过于繁琐。Spring 为资源访问提供了一个 Resource 接口,该接口提供了更强的资源访问能力。
WEBJ2EE
2019/08/14
9020
推荐阅读
相关推荐
Spring Resources资源操作
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验