SpringBoot配置文件的使用
我们在完成第一个SpringBoot应用时候,并未添加过多的配置,但是应用却能跑起来,这也是SpringBoot应用的特殊之处。它遵循约定优于配置的原则。但是,我们在开发环境中,难免会添加一些个人的配置,比如:上传图片的路径,AppId,Appkey等。
配置文件格式
springboot默认的全局配置文件名为application.properties
或者application.yml
(spring官方推荐使用的格式是.yml格式,目前官网都是实例都是使用yml格式进行配置讲解的,自动生成的项目也是yml格式),应用启动时会自动加载此文件,无需手动引入。除此之外还有一个bootstrap的全局文件,它的加载顺序在application配置文件之前,主要是用于在应用程序上下文的引导阶段。
下面是两个配置文件格式的对比,两个文件是等价的:application.yml
,配置属性后面一定要有空格
environments:
dev:
url: http://dev.bar.com
name: Developer Setup
prod:
url: http://foo.bar.com
name: My Cool App
application.properties
environments.dev.url=http://dev.bar.com
environments.dev.name=Developer Setup
environments.prod.url=http://foo.bar.com
environments.prod.name=My Cool App
注意
:YAML目前还有一些不足,它无法通过@PropertySource注解来加载配置。但是,YAML加载属性到内存中保存的时候是有序的,所以当配置文件中的信息需要具备顺序含义时,YAML的配置方式比起properties配置文件更有优势。
自定义配置
比如我们在application.yml
添加
book:
name: SpringBoot
author: Haohaowang
然后,在应用中我们可以通过@Value
注解来加载这些自定义的参数,比如:
@Component
public class Book {
@Value("${book.name}")
private String name;
@Value("${book.author}")
private String author;
}
注意:@Value
注解加载属性值的时候可以支持两种表达式来进行配置:
- 我们上面介绍的PlaceHolder方式,格式为 ${...},大括号内为PlaceHolder
- 还可以使用SpEL表达式(Spring Expression Language), 格式为 #{...},大括号内为SpEL表达式
参数引用
在配置文件中的各个参数之间,我们也可以直接通过使用PlaceHolder的方式来进行引用,就像下面的设置:
如下图:blog: name: SpringBoot autor: Haohaowang desc: ${blog.name} is write ${blog.autor}
使用随机数
配置文件的另外一个强大之处,就是可以产生一些伪随机数。在一些特殊情况下,有些参数我们希望它每次加载的时候不是一个固定的值,比如:密钥、服务端口等。在Spring Boot的属性配置文件中,我们可以通过使用${random}配置来产生随机的int值、long值或者string字符串,这样我们就可以容易的通过配置来属性的随机生成,而不是在程序中通过编码来实现这些逻辑。
${random}的配置方式主要有一下几种,可作为参考使用。
# 随机字符串
com:
value: ${random.value}
# 随机int
number: ${random.int}
# 随机long
bignumber: ${random.long}
# 10以内的随机数
test1: ${random.int(10)}
# 10-20的随机数
test2: ${random.int[10,20]}
多环境配置
我们在开发任何应用的时候,通常同一套程序会被应用和安装到几个不同的环境,比如:开发、测试、生产等。其中每个环境的数据库地址、服务器端口等等配置都会不同,如果在为不同环境打包时都要频繁修改配置文件的话,那必将是个非常繁琐且容易发生错误的事。
对于多环境的配置,各种项目构建工具或是框架的基本思路是一致的,通过配置多份不同环境的配置文件,再通过打包命令指定需要打包的内容之后进行区分打包,Spring Boot也不例外,或者说更加简单。
在Spring Boot中多环境配置文件名需要满足application-{profile}.yml的格式,其中{profile}对应你的环境标识,比如:
application-dev.yml:开发环境
application-test.yml:测试环境
application-prod.yml:生产环境
至于哪个具体的配置文件会被加载,需要在application.yml文件中通过spring.profiles.active属性来设置,其值对应配置文件中的{profile}值。如:spring.profiles.active=test(properties文件写法)就会加载application-test.yml配置文件内容。
我们既然配置了多个环境的配置文件,就可以动态的切换使用。如下命令:
java -jar xxx.jar --spring.profiles.active=prod
这样的话我们就将环境切换到生产环境的配置了。
加载顺序
上面我们提到可以动态的切换配置文件,这个时候肯定就有配置文件的优先级来了,优先级高的就会覆盖优先级低的配置。
1 命令行中传入的参数。
2 SPRING_APPLICATION_JSON中的属性。SPRING_APPLICATION_JSON是以JSON格式配置在系统环境变量中的内容。
3 java:comp/env中的JNDI属性。
4 Java的系统属性,可以通过System.getProperties()获得的内容。
5 操作系统的环境变量
6 通过random.*配置的随机属性
7位于当前应用jar包之外,针对不同{profile}环境的配置文件内容,例如:7 application-{profile}.properties或是YAML定义的配置文件
8 位于当前应用jar包之内,针对不同{profile}环境的配置文件内容,例如:application-{profile}.properties或是YAML定义的配置文件
9 位于当前应用jar包之外的application.properties和YAML配置内容
10 位于当前应用jar包之内的application.properties和YAML配置内容
11 在@Configuration注解修改的类中,通过@PropertySource注解定义的属性
12应用默认属性,使用SpringApplication.setDefaultProperties定义的内容优先级按上面的顺序有高到低,数字越小优先级越高。
可以看到,其中第7项和第9项都是从应用jar包之外读取配置文件,所以,实现外部化配置的原理就是从此切入,为其指定外部配置文件的加载位置来取代jar包之内的配置内容。通过这样的实现,我们的工程在配置中就变的非常干净,我们只需要在本地放置开发需要的配置即可,而其他环境的配置就可以不用关心,由其对应环境的负责人去维护即可。
自定义配置文件
在多数情况下,配置信息基本上都是放入application.properties文件中,但在一些场景下,比如某个配置项比较多时,为了分开存放,也可自定义配置文件,如my.properties。由于自定义的文件,系统不会自动加载,这个时候就需要手动引入了。
利用@PropertySource注解既可以引入配置文件,需要引入多个时,可使用@PropertySources设置数组,引入多个文件。
@SpringBootApplication
@PropertySource(value="classpath:my.properties",encoding="utf-8")
public class SpringBootApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootApplication.class, args);
}
}
配置绑定对象
虽然使用@Value()方式,能方便的引入自定义的属性值,但在多某个配置项属于某一配置时,希望对应到一个实体配置类中,springboot也提供了支持。利用@ConfigurationProperties属性,即可完成
my.properties配置文件:
config.code=code
config.name=hao
config.hobby[0]=爬山
config.hobby[1]=旅游
实体类:
@Component
//@EnableConfigurationProperties(value= {Config.class})
@ConfigurationProperties(prefix="config")
@Data
public class Config {
String code;
String name;
List<String> hobby;
}
这里可直接加入@Component使其在启动时被自动扫描到,或者使用@EnableConfigurationProperties注解注册此实体bean.
其次,在引入@ConfigurationProperties时,IDE会提示你引入spring-boot-configuration-processor依赖,前面提到,在自定义属性时,创建additional-spring-configuration-metadata.json可进行属性提示,而此依赖功能类似,会编译时自动生成spring-configuration-metadata.json文件,此文件主要给IDE使用,用于提示使用。添加后在配置文件点击属性时,会自动跳转到对应绑定的实体类中
本文大致讲解了SpringBoot配置文件的基本使用,还有好多东西没有写。
- 本文标签: SpringBoot
- 版权声明: 本站原创文章,于2019年10月14日由好好网发布,转载请注明出处