概述

在业务开发中经常有可能读取一些自定义配置或者文件。比如说公私钥文件、一些固定的词典文件之类的,这一类统称为资源(Resource)。Spring自带有资源加载功能,甚至还有非常便利的方法将读取的内容注入Spring bean。

整理网络上相关方法与自身实践的实践

通过Resource接口读取文件

我们可以使用org.springframework.core.io.Resource接口简化资源文件的定位。Spring帮助我们使用资源加载器查找和读取资源,资源加载器根据提供的路径决定选择哪个Resource实现。

使用Resource的实现类

org.springframework.core.io.Resource接口常用的有两个实现类:

  • org.springframework.core.io.ClassPathResource

    用来加载classpath下的资源,直接读取springboot 配置文件 application.properties,其中已经写入了一个配置 server.port=8080

    @Test
    public void classPathResourceTest() throws IOException {
    Resource resource = new ClassPathResource("application.properties");
    InputStream inputStream = resource.getInputStream();
    Properties properties = new Properties();
    properties.load(inputStream);
    properties.forEach((o, o2) -> {
    Assertions.assertThat(o).isEqualTo("server.address");
    Assertions.assertThat(o2).isEqualTo("8080");
    });
    }
  • org.springframework.core.io.FileSystemResource

    用来加载系统文件,通常通过文件的绝对值或者相对路径来读取。需要文件的路径。

    @Test
    public void fileResourceTest() throws IOException {
    String path = "/workspaces/springboot-demo/src/main/resources/application.properties";
    FileSystemResource resource = new FileSystemResource(path);
    InputStream inputStream = resource.getInputStream();
    Properties properties = new Properties();
    properties.load(inputStream);
    properties.forEach((o,o2) -> {
    Assertions.assertThat(o).isEqualTo("server.adderss");
    Assertions.assertThat(o2).isEqualTo("8080");
    });
    }

使用ResourceLoader

使用ResourceLoader可以实现延迟加载:

@Test
public void resourceLoaderTest() throws IOException {
ResourceLoader resourceLoader = new DefaultResourceLoader();
String location = "application.properties";
Resource resource = resourceLoader.getResource(location);
InputStream is = resource.getInputStream();
Properties properties = new Properties();
properties.load(is);
properties.forEach((o,o2) -> {
Assertions.assertThat(o).isEqualTo("server.adderss");
Assertions.assertThat(o2).isEqualTo("8080");
});
}

可以使用@AutowiredResourceLoader注入为bean.

使用@Value注解

@Value("classpath:application.properties")
private Resource resource;

@Test
public void resourceLoader() throws IOException {
InputStream inputStream = resource.getInputStream;
Properties properties = new Properties();
properties.load(inputStream);

properties.forEach((o,o2) -> {
Assertions.assertThat(o).isEqualTo("server.adderss");
Assertions.assertThat(o2).isEqualTo("8080");
});
}