Spring Boot系列之九 配置和Profiles(一)

本文详细介绍SpringBoot中的配置管理方式,包括使用.properties和.yml文件、环境变量及命令行参数等,并探讨配置优先级与覆盖机制。

简介

前面几章简单介绍了Spring Boot的基本使用,利用前面几章的内容已经可以进行简单应用的开发了.不过,我们有必要去更深入的了解Spring Boot的特性和内容,以帮助我们解决那些看起来比较困难的问题.

本章介绍一下Spring Boot的配置内容和Profiles的使用.

配置

Spring Boot允许使用配置文件来管理我们项目的配置.将某些配置写在配置文件的好处咱就不说了.

在Spring Boot中,我们可以使用`.properties`和`.yml`文件,也可以使用`环境变量`和`命令行参数`来管理我们的配置.

配置优先级以及覆盖

Spring Boot通过`PropertySource`来管理各种配置,其优先级如下:

  • 命令行参数

  • java:comp/env的JNDI属性

  • java系统属性(System.getProperties())

  • 操作系统环境变量

  • random.\*产生的`RandomValuePropertySource` (在配置文件中生成随机数)

  • 在打包的jar外的应用程序配置文件(application.properties,包含YAML和profile变量)

  • 在打包的jar内的应用程序配置文件(application.properties,包含YAML和profile变量)

  • 在@Configuration类上的@PropertySource注解

  • 默认属性(使用SpringApplication.setDefaultProperties指定)

从上到下,优先级依次降低,并且优先级低的会被优先级高的覆盖掉.也就是说,如果我们在使用命令行参数时制定了一个原本在application.properties文件中制定的参数,那么该值则会使用命令行参数时制定的值.

以此类推.

`.properties`和`.yml`文件

在使用这两种配置文件管理我们的配置时,我们可以直接在代码中使用`@Value`注解来注入我们的配置,也可以通过`@ConfigurationProperties`注解,将我们的配置直接绑定到一个Java Class中,

通过`@AutoWired`注入这个Java Class来使用.

  • 配置文件

Spring Boot系列之九 配置和Profiles(一)

  • 使用`@Value`

Spring Boot系列之九 配置和Profiles(一)

  • 使用`@ConfigurationProperties`

Spring Boot系列之九 配置和Profiles(一)

  • 测试

Spring Boot系列之九 配置和Profiles(一)

  • 使用`命令行参数`

先来创建一个Controller

Spring Boot系列之九 配置和Profiles(一)

  • 默认情况

    在默认情况下`curl http://localhost:8080/settings`或者直接在浏览器调用`http://localhost:8080/settings` 会返回`阳光如初.`.

  • 使用`命令行参数`输出

好吧,现在来测一下使用`命令行参数`指定`veryjava.name`会得到什么样的结果.

使用`mvn package -Dmaven.test.skip` 打成jar包后,再使用`java -jar settings-0.0.1-SNAPSHOT.jar --veryjava.name=sunshineasbefore.`运行该项目.

再次调用`curl http://localhost:8080/settings`或者直接在浏览器调用`http://localhost:8080/settings`,返回`sunshineasbefore.`

这个地方充分说明了Spring Boot关于配置项的优先级覆盖问题.

进阶

基本的配置项说完了,再来看看Spring Boot支持的其他高级配置特性.

  • 配置随机值

`RandomValuePropertySource` 可以让我们在配置文件中直接产生随机值.这些随机值包含整数,long或字符串类型

几种生成随机数的例子:

my.secret=${random.value}

my.number=${random.int}

my.bignumber=${random.long}

my.uuid=${random.uuid}

my.number.less.than.ten=${random.int(10)}

my.number.in.range=${random.int[1024,65536]}

  • 配置项

Spring Boot系列之九 配置和Profiles(一)

  • 新建一个My类

  • 修改VeryJavaProperties类

    新增 `private My my;` 字段和其getter/setter方法.

  • 测试

Spring Boot系列之九 配置和Profiles(一)

  • 加载application属性文件

默认情况下 Spring Boot加载`src/main/resources/application.properties`文件,当然我们可以通过命令行指定配置文件的位置或名称.

  • 指定名称

    java -jar myproject.jar --spring.config.name=myproject

  • 指定位置

    java -jar myproject.jar --spring.config.location=classpath:/default.properties,classpath:/override.properties

  • 属性占位符/引用其他属性值

当然必须引用先前定义的,而不是之后定义的.

Spring Boot系列之九 配置和Profiles(一)

Over.

类型安全的配置属性

我们来重新详细介绍一下`@ConfigurationProperties`注解的使用.

Java是一个强类型安全的语言.每一个变量必须有它特定的类型,这样也保证了Java语言本身的安全性.

类型安全的配置属性,也就是说给配置文件里的每一个配置项都加上类型,比如String.

几个重点:

  • 在使用`@ConfigurationProperties`注解时我们可以用`prefix`来指定要加载的配置项的前缀.

  • 配置项的名称和类字段的对应关系:

    eg:

    `private String firstName;`字段

    配置文件配置项:

  • person.firstName

  • person.first-name

  • PERSON_FIRST_NAME

  • 属性值校验

使用`SR-303 javax.validation约束注解`

eg:

使用`@NotNull`注解

Spring Boot系列之九 配置和Profiles(一)

代码

本文限于篇幅原因,不能展示所有的代码,如果想要完整的代码示例,请移步 https://github.com/sunshineasbefore/veryjava.spring.boot/tree/master/settings

支持请点赞,不喜勿喷.

每天一点点,成长多一点.

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值