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注解
指定该配置文件的位置
接下来你需要在类中这样描述
@Data
@Component
@PropertySource("classpath:/students.properties")
@ConfigurationProperties(prefix = "exp")
public class Student {
private String userName;
private Integer age;
}
大功告成
3.使用 Environment 读取配置文件
这是我最不喜欢的一种方式,主要是不够明了,这个Environment类可以直接在项目中进行注入并且使用,它可以在项目启动时加载项目默认的配置文件和使用@PropertySource注解指定的配置文件并存储起来,可以使用getProperty方法进行读取值的操作。一般用法如下
@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的属性,其他都是微信支付的属性
接下来创建实体类用以注入
大家可以看下图中的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时: