ResourceLoader
是 Spring 框架中用于加载资源的接口。它定义了一系列用于获取资源的方法,可以处理各种资源,包括类路径资源、文件系统资源、URL 资源等。
以下是 ResourceLoader
接口的主要方法:
-
Resource getResource(String location)
:- 根据给定的资源位置字符串返回一个
Resource
对象。 - 位置字符串可以是类路径、文件系统路径、URL 等形式。
- 根据给定的资源位置字符串返回一个
-
ClassLoader getClassLoader()
:- 返回与此资源加载器关联的类加载器。
- 可以用于加载类路径下的资源。
-
Resource[] getResources(String locationPattern)
:- 根据模式字符串返回一个资源数组。
- 模式字符串支持通配符,比如
classpath*:/**/*.xml
。
-
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 {@Autowiredprivate 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 {@Autowiredprivate 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 {@Autowiredprivate 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 {@Autowiredprivate 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 正常: