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

  • 如你对本文有疑问或本文有错误之处,欢迎评论留言指出。如觉得本文对你有所帮助,欢迎点赞和关注。
相关文章
|
3月前
|
XML 前端开发 Java
基于SpringBoot 3.3实现任意文件在线预览功能的技术分享
【8月更文挑战第30天】在当今的数字化办公环境中,文件在线预览已成为提升工作效率、优化用户体验的重要功能之一。无论是文档、图片、PDF还是代码文件,用户都期望能够直接在浏览器中快速查看而无需下载。本文将围绕如何在Spring Boot 3.3框架下实现这一功能,分享一系列技术干货,助力开发者高效构建文件预览服务。
340 2
|
14天前
|
Java 应用服务中间件
SpringBoot获取项目文件的绝对路径和相对路径
SpringBoot获取项目文件的绝对路径和相对路径
53 1
SpringBoot获取项目文件的绝对路径和相对路径
|
8天前
|
网络协议 Java
springboot配置hosts文件
springboot配置hosts文件
35 11
|
24天前
|
XML Java Kotlin
springboot + minio + kkfile实现文件预览
本文介绍了如何在容器中安装和启动kkfileviewer,并通过Spring Boot集成MinIO实现文件上传与预览功能。首先,通过下载kkfileviewer源码并构建Docker镜像来部署文件预览服务。接着,在Spring Boot项目中添加MinIO依赖,配置MinIO客户端,并实现文件上传与获取预览链接的接口。最后,通过测试验证文件上传和预览功能的正确性。
springboot + minio + kkfile实现文件预览
|
13天前
|
存储 前端开发 JavaScript
|
13天前
|
存储 Java API
|
1月前
|
easyexcel Java UED
SpringBoot中大量数据导出方案:使用EasyExcel并行导出多个excel文件并压缩zip后下载
在SpringBoot环境中,为了优化大量数据的Excel导出体验,可采用异步方式处理。具体做法是将数据拆分后利用`CompletableFuture`与`ThreadPoolTaskExecutor`并行导出,并使用EasyExcel生成多个Excel文件,最终将其压缩成ZIP文件供下载。此方案提升了导出效率,改善了用户体验。代码示例展示了如何实现这一过程,包括多线程处理、模板导出及资源清理等关键步骤。
|
15天前
|
Java
SpringBoot获取文件将要上传的IP地址
SpringBoot获取文件将要上传的IP地址
29 0
|
1月前
|
消息中间件 Java 大数据
大数据-56 Kafka SpringBoot与Kafka 基础简单配置和使用 Java代码 POM文件
大数据-56 Kafka SpringBoot与Kafka 基础简单配置和使用 Java代码 POM文件
65 2
|
1月前
|
Java 关系型数据库 数据库连接
SpringBoot项目使用yml文件链接数据库异常
【10月更文挑战第3天】Spring Boot项目中数据库连接问题可能源于配置错误或依赖缺失。YAML配置文件的格式不正确,如缩进错误,会导致解析失败;而数据库驱动不匹配、连接字符串或认证信息错误同样引发连接异常。解决方法包括检查并修正YAML格式,确认配置属性无误,以及添加正确的数据库驱动依赖。利用日志记录和异常信息分析可辅助问题排查。
177 10