一、简介
在实际的项目开发过程中,我们经常需要将某些变量从代码里面抽离出来,放在配置文件里面,以便更加统一、灵活的管理服务配置信息。比如,数据库、eureka、zookeeper、redis、mq、kafka 等服务组件的连接参数配置,还有我们自定义的项目参数配置变量。
当然,实际上根据当前的业务需求,我们往往会自定义参数,然后注入到代码里面去,以便灵活使用!
今天,我们就一起来聊一聊SpringBoot加载配置文件的几种玩法,如果有遗漏,欢迎留言!
SpringBoot 项目在启用时,首先会默认加载bootstrap.properties或者bootstrap.yml这两个配置文件(这两个优先级最高);接着会加载application.properties或application.yml;如果何配置了spring.profiles这个变量,同时还会加载对应的application-{profile}.properties或者application-{profile}.yml文件,profile为对应的环境变量,比如dev,如果没有配置,则会加载profile=default的配置文件。
虽然说配置项都写在同一个配置文件没有问题,但是很多时候我们仍然希望能分开写,这样会比较清晰,比如zookeeper的配置写在zookeeper.properties,数据库相关的配置写在datasource.properties等等,因此就需要设置加载外部配置文件!
具体该如何实现呢,我们一起来看看!
二、代码实践
2.1、通过@value注解实现参数加载
当我们想要在某个类里面注入某个变量,通过@value注解就可以简单实现参数的注入!
例如application.properties文件里,配置一个config.name的变量key,值为zhangsan
//参数定义
config.name=zhangsan
然后在对应的类里面,通过参数@value注入即可!
@RestController
public class HelloController {
@Value("${config.name}")
private String config;
@GetMapping("config")
public String config(){
return JSON.toJSONString(config);
}
}
使用@value注解注入配置,通常情况下有个要求就是,注解里面的变量,必须在application.properties文件里面事先定义好,否则启动报错!
当然,如果我们不想让它抱错,我们可以给它一个缺省值xxx,比如:
@Value("${config.name:xxx}")
private String config;
这样,SpringBoot 项目在启用时不会报错!
2.2、通过@ConfigurationProperties注解实现参数加载
某些场景下,@value注解并不能满足我们所有的需求,比如参数配置的数据类型是一个对象或者数组,这个时候才用@ConfigurationProperties会是一个比较好的选择!
- 配置一个对象类型的参数
例如在application.properties文件里,当我们想配置一个对象类型的参数,我们可以这样操作!
//参数定义
config2.name=demo_1
config2.value=demo_value_1
然后,创建一个配置类Config2,用于将定义的变量映射到配置类里面。
@Compone