当前位置: 首页 > article >正文

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 正常:
在这里插入图片描述


http://www.kler.cn/a/135332.html

相关文章:

  • Unity 性能优化方案
  • change buffer:到底应该选择普通索引还是唯一索引
  • HP G10服务器ESXI6.7告警提示ramdisk tmp已满
  • 【OH】openHarmony开发环境搭建(基于windows子系统WSL)
  • 搭建Python2和Python3虚拟环境
  • 【练习案例】30个 CSS Javascript 加载器动画效果
  • 使用 Amazon VPS 探索存储选项:实用指南
  • Flutter 3.16 中带来的更新
  • selenium长截图,截图整个页面
  • (C)一些题2
  • 成为电车销量的“中坚力量”,微小型车不能只有“低价”?
  • 场景交互与场景漫游-osgGA库(5)
  • 如何使用Fiddler进行弱网测试
  • 模块化Common JS 和 ES Module
  • MongoDB相关基础操作(库、集合、文档)
  • Python实现WOA智能鲸鱼优化算法优化随机森林回归模型(RandomForestRegressor算法)项目实战
  • Django 入门学习总结4
  • 如何利用Python开发自动发布文章脚本?记录开发万媒易发的心路历程
  • 计算一个6人的队形问题
  • 多位数组转化为一维数组
  • Kotlin 核心语法,为什么选择Kotlin ?
  • Centos(Linux)服务器安装Dotnet8 及 常见问题解决
  • 世微 电动车摩托车灯 5-80V 1.2A 一切二降压恒流驱动器AP2915
  • 深入了解百度爬虫工作原理
  • rook-ceph部署
  • GitHub 2023报告-开源和AI的现状