Spring Boot 中使用 ResourceLoader 加载资源的完整示例

ResourceLoader 是 Spring 框架中用于加载资源的接口。它定义了一系列用于获取资源的方法,可以处理各种资源,包括类路径资源、文件系统资源、URL 资源等。

以下是 ResourceLoader 接口的主要方法:

  1. Resource getResource(String location)

    • 根据给定的资源位置字符串返回一个 Resource 对象。
    • 位置字符串可以是类路径、文件系统路径、URL 等形式。
  2. ClassLoader getClassLoader()

    • 返回与此资源加载器关联的类加载器。
    • 可以用于加载类路径下的资源。
  3. Resource[] getResources(String locationPattern)

    • 根据模式字符串返回一个资源数组。
    • 模式字符串支持通配符,比如 classpath*:/**/*.xml
  4. Class<?> resolveClassName(String className)

    • 根据类名解析成 Class 对象。
    • 这样可以方便地获取到类信息。

在 Spring 框架中,ResourceLoader 的常用实现类是 DefaultResourceLoader,它提供了对资源加载的默认实现。在大多数情况下,不需要手动实现这个接口,而是使用 Spring 框架中提供的资源加载机制。

在 Spring Boot 中,ResourceLoader 的默认实现是 ResourceLoader 接口的实现类 DefaultResourceLoader。Spring Boot 还提供了更高级的资源加载方式,例如使用 @Value 注解加载配置文件中的属性,或者使用 @PropertySource 注解加载外部配置文件。

要使用 ResourceLoader,可以将其注入类中,例如在 Spring Boot 的组件中:

复制代码
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;
import org.springframework.stereotype.Component;

@Component
public class MyResourceLoader {

    @Autowired
    private ResourceLoader resourceLoader;

    public void loadResource(String location) {
        Resource resource = resourceLoader.getResource(location);

        // 处理资源,例如读取文件内容
        // ...
    }
}

在上面的例子中,ResourceLoader 被注入到 MyResourceLoader 中,可以使用它来加载资源。

下面来一个完整的例子:

1、创建一个demo.txt用来测试

resources/demo.txt

复制代码
这是一个测试文本第一行
这是一个测试文本第二行
这是一个测试文本第三行

2、定义资源加载解析组件

复制代码
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;
import org.springframework.stereotype.Component;

import java.io.*;

@Component
public class MyResourceLoader {

    @Autowired
    private ResourceLoader resourceLoader;

    public String loadResource(String location) {
        // 获取资源
        Resource resource = resourceLoader.getResource(location);

        // 检查资源是否存在
        if (!resource.exists()) {
            System.out.println("该资源不存在!");
            return "该资源不存在!";
        }

        System.out.println("资源存在!");

        try (InputStream inputStream = resource.getInputStream();
             BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
             StringWriter writer = new StringWriter()) {

            String line;
            while ((line = reader.readLine()) != null) {
                writer.write(line);
                // 添加换行符 :每次读取一行后都会添加一个换行符,确保了每行的结尾都有换行符。
                // 如果仍然没有效果,请确认文件本身是否包含换行符。
                writer.write(System.lineSeparator());
            }

            return writer.toString();
        } catch (IOException e) {
            System.err.println("读取资源错误: " + e.getMessage());
            return "读取资源错误: " + e.getMessage();
        }
    }
}

3、service

复制代码
import com.lfsun.demolfsunstudyresourceloader.config.MyResourceLoader;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class ResourceService {

    @Autowired
    private MyResourceLoader resourceLoader;

    public String getMyResource(String fileName) {
        System.out.println("寻找资源:" + String.format("classpath:%s",fileName));
        return resourceLoader.loadResource(String.format("classpath:%s",fileName));
    }

}

4、controller

复制代码
import com.lfsun.demolfsunstudyresourceloader.service.ResourceService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/resource")
public class ResourceController {

    @Autowired
    private ResourceService resourceService;
    // http://localhost:8080/resource/demo.txt
    @GetMapping("/{fileName}")
    public String getMyResource(@PathVariable String fileName) {
        return resourceService.getMyResource(fileName);
    }
}

5、访问 http://localhost:8080/resource/demo.txt 即可

Edge:加了换行还是没效果...Google也是

Apifox 正常:

相关推荐
华仔啊1 天前
千万别给数据库字段加默认值 null!真的会出问题
java·数据库·后端
老赵全栈实战2 天前
【每日一技MyBatis trim标签核心用法
java·mybatis·orm
beata2 天前
Java基础-19:Java 死锁深度解析:从原理、检测到预防与实战指南
java·前端
吾日三省Java2 天前
Spring Cloud架构下的日志追踪:传统MDC vs 王炸SkyWalking
java·后端·架构
爱玩泥巴的小t2 天前
new Thread().start()底层做了什么?
java
码路飞2 天前
GPT-5.4 Computer Use 实战:3 步让 AI 操控浏览器帮你干活 🖥️
java·javascript
祈安_2 天前
Java实现循环队列、栈实现队列、队列实现栈
java·数据结构·算法
皮皮林5512 天前
拒绝写重复代码,试试这套开源的 SpringBoot 组件,效率翻倍~
java·spring boot
顺风尿一寸3 天前
从 Java NIO poll 到 Linux 内核 poll:一次系统调用的完整旅程
java
程途知微3 天前
JVM运行时数据区各区域作用与溢出原理
java