Springboot读取配置文件的方式以及多环境读取的方式

Springboot读取配置文件的方式以及多环境读取的方式

  • 一.首先介绍一下读取配置文件中的值的方式
    • 1.@Value注解
    • 2.@ConfigurationProperties注解赋值
    • 3.使用 Environment 读取配置文件
  • 多环境读取

在项目中我们可能需要灵活的配置一些参数,就会将这些参数写到yaml文件或者properties文件中进行读取,这里记录一些灵活读取的方式

一.首先介绍一下读取配置文件中的值的方式

1.@Value注解

该注解可以将配置文件()中的值注入到类的成员变量中,
application.yml中写入如下配置

server:
  port: 8888
  servlet:
    context-path: /demo5

name: zhangSan
age: 12
@Data
@Component
public class Student {
    @Value("${name}")
    private String name;
    @Value("${age}")
    private Integer age;

}

这样就可以在项目启动时从environment对象中拿到该配置文件中的键值对进行赋值了,如果想赋值给静态变量需要将注解加在具体属性的set方法上!

2.@ConfigurationProperties注解赋值

@ConfigurationProperties注解用于将外部属性值绑定到一个类的属性上,通过属性名前缀匹配的方式将属性值映射到对应的属性上
application.yml中写入如下配置

server:
  port: 8888
  servlet:
    context-path: /demo5

sykmi:
  name: zhangSan
  age: 12
@Data
@Component
@ConfigurationProperties(prefix = "sykmi")
public class Student {

    private String name;

    private Integer age;

}

这里我使用该注解指定前缀为sykmi,用以读取配置文件中该前缀下的属性值并赋值,更省事了一些,并且添加@Component注解将其添加到容器中,使用@Configuration也是可以的,作用都是添加到容器中
另外,如果你不想从Springboot的配置文件中定义这些属性读取,你想自己定义properties文件以供读取也是可以的,但是需要指定属性源,也就是需要添加@PropertySource注解,以下是一个简单的例子(我已经删除了application.yml中的name和age),我创建了一个students.properties配置文件放在了resources目录下,这里我使用@PropertySource注解指定该配置文件的位置
Springboot读取配置文件的方式以及多环境读取的方式_第1张图片
接下来你需要在类中这样描述

@Data
@Component
@PropertySource("classpath:/students.properties")
@ConfigurationProperties(prefix = "exp")
public class Student {

    private String userName;

    private Integer age;

}

大功告成

3.使用 Environment 读取配置文件

这是我最不喜欢的一种方式,主要是不够明了,这个Environment类可以直接在项目中进行注入并且使用,它可以在项目启动时加载项目默认的配置文件和使用@PropertySource注解指定的配置文件并存储起来,可以使用getProperty方法进行读取值的操作。一般用法如下
Springboot读取配置文件的方式以及多环境读取的方式_第2张图片

@Configuration
@PropertySource("classpath:/students.properties")
public class GenBean {
	//这里可以直接使用,它已经加载了一些配置文件的键值对了
    @Resource
    private Environment environment;

    @Bean
    public Student genStudent(){
        Student student = new Student();
        student.setUserName(environment.getProperty("exp.username"));//直接从environment拿值
        student.setAge(environment.getProperty("exp.age",Integer.class));//直接从environment拿值
        return student;
    }

}

上面这样的还算规范的,有的不规范的直接在项目中导入Environment对象进行拿值,不仔细看根本不知道从哪个配置文件中读取的值。因为一旦你配置类中或者其他以@ConfigurationProperties指定配置文件动态注入的时候,Environment对象中会有很多配置文件的键值对,感觉不太好。

多环境读取

有时候我们在开发环境、测试环境和生产环境需要动态读取不同的值,但是每次换环境启动的时候再更改配置文件中的值太麻烦了,所以催生出这种根据环境的不同动态读取值的方式。
这里我以读取微信支付配置文件做参考,示例如下:
首先在Springboot的总配置文件(一般是application.yml)中自定义一个值用来控制环境的定义

# 支付环境
customer:
  payEnv: prod

然后在resources文件夹下建立config/payConfig/wxPay/…文件夹,我分别为三个环境建立了dev/test/prod文件夹,并且都存放了一份wxpay.properties配置文件,其中为了区分观察我加了一个wxpay.ceshi的属性,其他都是微信支付的属性
Springboot读取配置文件的方式以及多环境读取的方式_第3张图片
接下来创建实体类用以注入
Springboot读取配置文件的方式以及多环境读取的方式_第4张图片
大家可以看下图中的classpath路径,我这里指定路径的过程中使用了${customer.payEnv}(SPEL表达式),用于动态引用值,这个值在哪呢?还记得总配置文件中的自定义的值吗?是的,就是那个值,在项目启动的过程中会将该值解析进去从而形成一个路径!所以当我们在总配置文件中将该值填成dev/test/prod时,项目启动时就会分别加载成
classpath:config/payConfig/wxPay/dev/wxpay.properties
classpath:config/payConfig/wxPay/test/wxpay.properties
classpath:config/payConfig/wxPay/prod/wxpay.properties

了!
让我们看看效果吧!
dev时:
在这里插入图片描述
test时:
在这里插入图片描述
prod时:
在这里插入图片描述

你可能感兴趣的:(SpringBoot学习,spring,boot,java)