SpringBoot读取配置文件的几种方式

简介: 在 SpringBoot 中呢,我们经常要读取配置文件的值,那读取配置文件的值有哪几种方式呢?跟着笔者一起来看看吧!
日积月累,水滴石穿 😄

前言

SpringBoot 中呢,我们经常要读取配置文件的值,那读取配置文件的值有哪几种方式呢?跟着笔者一起来看看吧!

一、使用@Value注解

先准备一下两个配置文件,名称为:application.propertiesapplication.yml

  • properties
userproperties.name=gongj===properties
userproperties.age=11===properties
userproperties.sex=12===properties
userproperties.email=3333@163.com===properties
  • yml
useryml:
  name: gongjie
  age: 23
  sex: 1
  email: 111@163.com
  • 测试
    @Value("${userproperties.name}")
    private String name;
    @Value("${userproperties.age}")
    private String age;
    @Value("${userproperties.sex}")
    private String sex;
    @Value("${userproperties.email}")
    private String email;

    @Value("${useryml.name}")
    private String nameyml;
    @Value("${useryml.age}")
    private String ageyml;
    @Value("${useryml.sex}")
    private String sexyml;
    @Value("${useryml.email}")
    private String emailyml;

    @Test
    public void testValue(){
    
        System.out.println("name=" + name + ",age=" + age + ",sex=" 
        + sex + ",email" + email);
        
       System.out.println("nameyml=" + nameyml + ",ageyml=" + ageyml 
       + ",sexyml=" + sexyml + ",emailyml" + emailyml);
    }

image.png

二、使用@ConfigurationProperties注解

  • properties
@Component
@ConfigurationProperties(prefix = "userproperties")
public class ReadPropertiesValue {
    private String name;
    private String age;
    private String email;
    private String sex;

    @Override
    public String toString() {
        return "ReadPropertiesValue{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", email='" + email + '\'' +
                ", sex=" + sex +
                '}';
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setAge(String age) {
        this.age = age;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }
}

prefix:指定配置文件中键名称的前缀。

注意:ReadPropertiesValue类上如果不用@Component修饰。则在容器无法获取。需要在启动类上加@EnableConfigurationProperties(ReadPropertiesValue.class)将其注册到容器中。

  • yml
@Component
@ConfigurationProperties(prefix = "useryml")
public class ReadYmlValue {
    private String name;
    private String age;
    private String email;
    private String sex;

    @Override
    public String toString() {
        return "ReadYmlValue{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", email='" + email + '\'' +
                ", sex=" + sex +
                '}';
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setAge(String age) {
        this.age = age;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }
}
  • 测试
    @Autowired
    ReadPropertiesValue readPropertiesValue;
    @Autowired
    ReadYmlValue readYmlValue;
    @Test
    public void readPropertiesValueTest(){
        System.out.println(readPropertiesValue.toString());
        System.out.println(readYmlValue.toString());
    }

image.png

三、使用Environment

注意:这种方式是直接依赖注入Evnironment对象,然后使用environment.getProperty("键名")即可读取对应的值。

  • 编码测试
@Autowired
Environment environment;

@Test
public void environmentTest(){

    System.out.println(environment.getProperty("userproperties.name") 
    + "==" + environment.getProperty("userproperties.age") + "==" + 
    environment.getProperty("userproperties.sex") + "==" + 
    environment.getProperty("userproperties.email"));

    System.out.println(environment.getProperty("useryml.name") + "==" 
    + environment.getProperty("useryml.age") + "==" + 
    environment.getProperty("useryml.sex") + "==" + 
    environment.getProperty("useryml.email"));

}

image.png

上面几种方式都是读取默认配置文件application.propertiesapplication.yml。但在公司的正式开发中肯定不可能就这两个文件。一般都会有自定义的配置文件,这时候就要指定加载配置文件了。

读取自定义配置文件

创建configValue.propertiesconfigValue.yml配置文件

  • configValue.properties
userconfigvalueproperties.name=yuanjConfigValue
userconfigvalueproperties.age=11ConfigValue
userconfigvalueproperties.sex=12ConfigValue
userconfigvalueproperties.email=3333@163.comConfigValue
  • yml
userconfigvalueyml:
  name: yuanjconfigvalueyml
  age: 11configvalueyml
  sex: 12configvalueyml
  email: 3333@163.comconfigvalueyml

一、使用@PropertySource + @Value

  • 读取 properties 文件内容
@Component
@PropertySource(value = "classpath:configValue.properties")
public class ReadPropertiesByValue {

    @Value("${userconfigvalueproperties.name}")
    public String name;
    @Value("${userconfigvalueproperties.age}")
    public String age;
    @Value("${userconfigvalueproperties.sex}")
    public String sex;
    @Value("${userconfigvalueproperties.email}")
    public String email;

    @Override
    public String toString() {
        return "ReadPropertiesByValue{" +
                "name='" + name + '\'' +
                ", age='" + age + '\'' +
                ", sex='" + sex + '\'' +
                ", email='" + email + '\'' +
                '}';
    }
}

@PropertySource注解中配置了一个属性,value:指定配置文件的位置。

  • 读取 yml 文件内容
@Component
@PropertySource(value = "classpath:configValue.yml")
public class ReadYmlByValue {
    
    @Value("${userconfigvalueyml.name}")
    public String name;
    @Value("${userconfigvalueyml.age}")
    public String age;
    @Value("${userconfigvalueyml.sex}")
    public String sex;
    @Value("${userconfigvalueyml.email}")
    public String email;

    @Override
    public String toString() {
        return "ReadYmlByValue{" +
                "name='" + name + '\'' +
                ", age='" + age + '\'' +
                ", sex='" + sex + '\'' +
                ", email='" + email + '\'' +
                '}';
    }
}
@Autowired
ReadPropertiesByValue readPropertiesByValue;

@Autowired
ReadYmlByValue readYmlByValue;

@Test
public void readPropertiesByValue(){
    System.out.println(readPropertiesByValue.toString());
    System.out.println(readYmlByValue.toString());
}

image.png

二、使用@PropertySource + @ConfigurationProperties

  • properties
@Component
@ConfigurationProperties(prefix = "userconfigvalueproperties")
@PropertySource(value = { "classpath:configValue.properties" })
public class ReadPropertiesConfigValue {
    private String name;
    private String age;
    private String email;
    private String sex;

    @Override
    public String toString() {
        return "ReadPropertiesConfigValue{" +
                "name='" + name + '\'' +
                ", age='" + age + '\'' +
                ", email='" + email + '\'' +
                ", sex='" + sex + '\'' +
                '}';
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setAge(String age) {
        this.age = age;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }
}
  • yml
@Component
@ConfigurationProperties(prefix = "userconfigvalueyml")
@PropertySource(value = { "classpath:configValue.yml" }, 
factory = CommPropertyResourceFactory.class)
public class ReadYmlConfigValue {
    private String name;
    private String age;
    private String email;
    private String sex;

    @Override
    public String toString() {
        return "ReadYmlConfigValue{" +
                "name='" + name + '\'' +
                ", age='" + age + '\'' +
                ", email='" + email + '\'' +
                ", sex='" + sex + '\'' +
                '}';
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setAge(String age) {
        this.age = age;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }
}

由于@PropertySource是不支持yaml读取的,所以我们需要改造一下。

import org.springframework.boot.env.YamlPropertySourceLoader;
import org.springframework.core.env.PropertySource;
import org.springframework.core.io.support.DefaultPropertySourceFactory;
import org.springframework.core.io.support.EncodedResource;
import org.springframework.core.io.support.PropertySourceFactory;
import org.springframework.lang.Nullable;

import java.io.IOException;
import java.util.List;
import java.util.Optional;

public class CommPropertyResourceFactory implements PropertySourceFactory {

@Override
public PropertySource<?> createPropertySource(@Nullable String name, EncodedResource
        resource) throws IOException {
    String resourceName = Optional.ofNullable(name).orElse(resource.getResource().getFilename());
    if (resourceName.endsWith(".yml") || resourceName.endsWith(".yaml")) {
        List<org.springframework.core.env.PropertySource<?>> yamlSources = 
            new YamlPropertySourceLoader().load(resourceName, resource.getResource());
        return yamlSources.get(0);
    } else {
        return new DefaultPropertySourceFactory()
            .createPropertySource(name, resource);
    }
}
}

在需要读取yaml的时候,要增加factory参数

@PropertySource(value = { "classpath:configValue.yml" }, 
factory = CommPropertyResourceFactory.class)
  • 测试
   //===========指定配置文件加载
    @Autowired
    ReadPropertiesConfigValue readPropertiesConfigValue;

    @Autowired
    ReadYmlConfigValue readYmlConfigValue;

    @Test
    public void readPropertiesConfigValueTest(){
        System.out.println(readPropertiesConfigValue.toString());
        System.out.println(readYmlConfigValue.toString());
    }

image-20210530144609496.png

  • 如你对本文有疑问或本文有错误之处,欢迎评论留言指出。如觉得本文对你有所帮助,欢迎点赞和关注。
相关文章
|
4月前
|
Java 容器
SpringBoot读取resources下的文件以及resources的资源路径
SpringBoot读取resources下的文件以及resources的资源路径
116 0
|
4月前
|
Java
SpringBoot文件上传单文件多文件上传
SpringBoot文件上传单文件多文件上传
37 0
|
22天前
|
XML 前端开发 Java
基于SpringBoot 3.3实现任意文件在线预览功能的技术分享
【8月更文挑战第30天】在当今的数字化办公环境中,文件在线预览已成为提升工作效率、优化用户体验的重要功能之一。无论是文档、图片、PDF还是代码文件,用户都期望能够直接在浏览器中快速查看而无需下载。本文将围绕如何在Spring Boot 3.3框架下实现这一功能,分享一系列技术干货,助力开发者高效构建文件预览服务。
105 2
|
2月前
|
存储 前端开发 Java
SpringBoot使用云端资源url下载文件的接口写法
在Spring Boot中实现从云端资源URL下载文件的功能可通过定义REST接口完成。示例代码展示了一个`FileDownloadController`,它包含使用`@GetMapping`注解的方法`downloadFile`,此方法接收URL参数,利用`RestTemplate`下载文件,并将文件字节数组封装为`ByteArrayResource`返回给客户端。此外,通过设置HTTP响应头,确保文件以附件形式下载。这种方法适用于从AWS S3或Google Cloud Storage等云服务下载文件。
272 7
|
1月前
|
JavaScript 前端开发 easyexcel
基于SpringBoot + EasyExcel + Vue + Blob实现导出Excel文件的前后端完整过程
本文展示了基于SpringBoot + EasyExcel + Vue + Blob实现导出Excel文件的完整过程,包括后端使用EasyExcel生成Excel文件流,前端通过Blob对象接收并触发下载的操作步骤和代码示例。
188 0
基于SpringBoot + EasyExcel + Vue + Blob实现导出Excel文件的前后端完整过程
|
27天前
|
Java Linux C++
【Azure 应用服务】App Service For Linux 部署Java Spring Boot应用后,查看日志文件时的疑惑
【Azure 应用服务】App Service For Linux 部署Java Spring Boot应用后,查看日志文件时的疑惑
|
1月前
|
存储 Java API
SpringBoot + MinIO 实现文件切片极速上传技术
【8月更文挑战第19天】在现代互联网应用中,文件上传是一个常见且重要的功能。然而,随着文件体积的增大,传统的文件上传方式往往面临效率低下、耗时过长等问题。为了提升大文件上传的速度和效率,我们可以采用文件切片上传技术,并结合SpringBoot和MinIO来实现这一功能。
121 0
|
1月前
|
Java
Java SpringBoot FTP 上传下载文件
Java SpringBoot FTP 上传下载文件
74 0
|
1月前
|
JavaScript Java
SpringBoot 下载文件
SpringBoot 下载文件
28 0
|
1月前
|
存储 运维 Java
SpringBoot使用log4j2将日志记录到文件及自定义数据库
通过上述步骤,你可以在Spring Boot应用中利用Log4j2将日志输出到文件和数据库中。这不仅促进了良好的日志管理实践,也为应用的监控和故障排查提供了强大的工具。强调一点,配置文件和代码的具体实现可能需要根据应用的实际需求和运行环境进行调优和修改,始终记住测试配置以确保一切运行正常。
292 0