文章使用版本为 Spring Boot 2.1.x
对应进阶系列 Spring Boot 进阶系列(二) 配置文件
前言
写项目的时候少不了需要根据不同的运行环境使用不同参数的情况,比如开发环境使用开发数据库,测试环境使用测试数据库,生产环境使用生产数据库。为了避免硬编码,通常我们会把这些需要随着运行环境变化而变化的参数配置到配置文件中去,在 Spring Boot(一) Hello World中介绍过我们使用application.yml(或者application.properties)来保存我们的配置参数,现在我们来详细学习下配置文件。
Spring Boot 自带的可配置参数
spring boot 自带了许多可配置的参数,具体可以参考spring-boot-autoconfig-x.x.x.RELEASE.jar => MATA-INFO => spring-configuration-matadata.json
,属性很多,我们就不一一介绍,这里我们只选取一个来做讲解。
server:
port: 就是我们的web服务启动的端口,默认值8080
大家可以试一下,什么参数都不配置,启动项目,观察启动日志,看看服务启动的端口是不是8080;如果不想使用默认值8080,就需要我们在配置文件中手动配置,比如配置成8090,重新启动项目,观察下是否在8090端口启动。
自定义配置
spring boot自带的配置能够让我们配置整个项目的基本参数,但是如果我们需要配置一些和业务相关的参数,spring boot就无能为力了,这个时候需要我们自定义配置,比如如下配置
someone:
name: 张三
age: 20
best-friend: 李四
那么在配置文件里配置的参数如何在项目中使用呢?一般有2中办法
- 通过
@Value
注入到程序中,这种方法适合参数比较少,或者参数间没什么关联的情况
@Value("${someone.name}")
private String name;
@Value("${someone.age}")
private String age;
@Value("${someone.best-friend}")
private String bestFriend;
- 如果你的参数非常多,且有非常强的关联性,使用上一种方法显得比较繁琐,这时候我们可以通过
@ConfigurationProperties
一次性把参数注入到Bean中。
package org.schhx.springbootlearn.config;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@ConfigurationProperties(prefix = "someone")
@Component
@Data
public class SomeoneProperties {
private String name;
private Integer age;
private String bestFriend;
}
然后在使用的地方把Bean直接注入进来就可以使用所有参数了
@Autowired
private SomeoneProperties someoneProperties;
多环境配置
现在我们已经知道了如何配置参数,那么如何才能让开发环境使用开发环境的参数,测试环境使用测试环境的参数呢?答案就是配置多个配置文件,然后指定使用一个。
我们现在已经有了application.yml,现在我们再新建几个文件application-default.yml、application-dev.yml、application-test.yml、application-prod.yml。然后在application.yml添加一个参数
spring:
profiles:
active: dev
它表示我们现在使用application-dev.yml这个配置文件,当然你也可以不配置,默认使用的是application-default.yml。
需要说明的是,使用了application-*.yml并不是说application.yml就不起作用了,应该是两个都起作用,只不过application-*.yml优先级比较高,它会覆盖掉application.yml中的同名属性。
我们可以做下测试,在application.yml中配置以下参数
spring:
profiles:
active: dev
server:
port: 8090
someone:
name: 张三
age: 20
best-friend: 李四
在application-dev.yml中配置以下参数
server:
port: 8081
启动项目,可以看到项目在8081端口启动
2018-01-21 09:35:46.725 INFO 22526 --- [ main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8081 (http)
然后访问someone的参数,可以看到,虽然application-dev.yml没有配置someone,我们依然可以访问到,说明application.yml配置的参数依然有效。
Properties from @Value
name = 张三
age = 20
bestFriend = 李四
Properties from bean
SomeoneProperties(name=张三, age=20, bestFriend=李四)
一般我们可以把不随着环境变化而变化的参数放在application.yml中,而那些随着环境变化的参数放到application-*.yml当中去。
使用命令行配置参数
除了使用配置文件,我们还可以使用命令行参数来来配置参数。虽然我们在application.yml中指定了使用的profile,但是这个是硬编码进去的,我们不可能每次换环境部署都去更改application.yml,这时候我们就需要在命令行指定需要激活的profile。
java -jar target/spring-boot-config.jar --spring.profiles.active=test
启动项目,可以发现项目在8082端口启动
2018-01-21 09:54:43.374 INFO 22595 --- [ main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8082 (http)
配置参数的优先级
通过上面的学些我们应该知道了参数优先级的顺序是
命令行参数 > application-\*.yml > application.yml
现在我们再来试验下,使用命令行启动项目
java -jar target/spring-boot-config.jar --spring.profiles.active=test --server.port=9090
可以看到项目在命令行指定的9090端口启动
2018-01-21 09:59:23.812 INFO 22609 --- [ main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 9090 (http)
总结
我们主要学习了
- 配置spring boot自带的参数
- 配置自定义参数,并使用2种方法读取
- 多环境下如何配置和使用参数
- 使用命令行配置参数
- 介绍了多种方式配置参数的优先级
网友评论