Spring Boot 入门系列(二) 配置文件

文章使用版本为 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种方法读取
  • 多环境下如何配置和使用参数
  • 使用命令行配置参数
  • 介绍了多种方式配置参数的优先级

完整示例

github

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,569评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,499评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,271评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,087评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,474评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,670评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,911评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,636评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,397评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,607评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,093评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,418评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,074评论 3 237
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,092评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,865评论 0 196
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,726评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,627评论 2 270