在Spring Boot的配置文件中,有两种后缀的配置文件,分别是.properties文件和.yml文件。Spring Boot 提供了对应用进行自动化配置。相比以前 XML 的配置方式,很多显式方式申明是不需要的。大多数默认的配置足够实现开发功能,从而更快速开发。

Spring Boot - 配置文件类型:

SpringBoot使用一个全局的配置文件,且配置文件名是固定的;

  • *.properties属性文件;属于最常见的一种;
  • *.yml是yaml格式的文件,yaml是一种非常简洁的标记语言。

.properties文件配置:

示例代码:

blog.config.title="柒索"
blog.config.subtitle="一个头脑聪明,五肢发达的男人。"
blog.config.url="http://object.ws"
blog.config.number=4000

.yml文件配置:

示例代码:

blog:
  config:
    title: 柒索
    subtitle: 一个头脑聪明,五肢发达的男人。
    url: http://object.ws
    number: ${random.int}

可以看出两种配置文件的写法yaml 文件的方式更简洁一些,所以推荐使用 yaml 文件来作为 Spring Boot 的配置文件。

Spring Boot - yml语法:

基本语法

k:(空格)v:表示一对键值对(空格必须有);

空格的缩进来控制层级关系;只要是左对齐的一列数据,都是同一个层级的

server:
    port: 8081
    path: /hello

属性和值也是大小写敏感;

值的写法

字面量:

普通的值(数字,字符串,布尔)

​ k: v:字面直接来写;

​ 字符串默认不用加上单引号或者双引号;

​ “”:双引号;不会转义字符串里面的特殊字符;特殊字符会作为本身想表示的意思

​ name: “zhangsan \n lisi”:输出;zhangsan 换行 lisi

​ ‘’:单引号;会转义特殊字符,特殊字符最终只是一个普通的字符串数据

​ name: ‘zhangsan \n lisi’:输出;zhangsan \n lisi

对象、Map、K:V:

​ k: v:在下一行来写对象的属性和值的关系;注意缩进

​ 对象还是k: v的方式

blog:
  title: 柒索
  age: 2

行内写法:

info: {url: object.ws,subtitle: .......}

数组(List、Set):

用- 值表示数组中的一个元素

tags:
  - java
  - go
  - node

行内写法

pets: [cat,dog,pig]

##Spring Boot 配置文件注入:

注入示例代码:

配置文件代码:

blog:
  title: 柒索
  age: 2
  isdynamic: false
  createdate: 2016/01/01
  tags:
    - java
    - go
    - node
  info:
    url: object.ws
    subtitle: 一个头脑聪明,五肢发达的男人

与之对应的JavaBean:

/**
 * 将配置文件中配置的每一个属性的值,映射到这个组件中
 * @ConfigurationProperties:告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定;
 *      prefix = "blog":配置文件中哪个下面的所有属性进行一一映射
 *
 * 只有这个组件是容器中的组件,才能容器提供的@ConfigurationProperties功能;
 *
 */
@Component
@ConfigurationProperties(prefix = "blog")
public class Blog {

    private String title;
    private Integer age;
    private Boolean isdynamic;
    private Date createdate;

    private Map<String,Object> tags;
    private List<Object> lists;
    private Info info;

我们可以导入配置文件处理器,以后编写配置就有提示了:

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-configuration-processor</artifactId>
	<optional>true</optional>
</dependency>

@Value和@ConfigurationProperties对比

@ConfigurationProperties @Value
功能 批量注入配置文件中的属性 一个个指定
松散绑定(松散语法) 支持 不支持
SpEL 不支持 支持
JSR303数据校验 支持 不支持
复杂类型封装 支持 不支持

配置文件yml还是properties他们都能获取到值;

如果说,我们只是在某个业务逻辑中需要获取一下配置文件中的某项值,使用@Value;

如果说,我们专门编写了一个javaBean来和配置文件进行映射,我们就直接使用@ConfigurationProperties;

配置文件注入值数据校验

@Component
@ConfigurationProperties(prefix = "blog")
@Validated
public class Blog {

    /**
     * <bean class="Blog">
     *      <property name="title" value="字面量/${key}从环境变量、配置文件中获取值/#{SpEL}"></property>
     * <bean/>
     */

   //title必须是邮箱格式
    @Email
    private String title;
    private Integer age;
    private Boolean isdynamic;
    private Date createdate;

    private Map<String,Object> tags;
    private List<Object> lists;
    private Info info;

Spring Boot - 配置文件占位符:

在配置文件中使用随机数:

Spring Boot的属性配置文件中可以通过${random}来产生int值、long值或者string字符串,来支持属性的随机值。

示例代码:

blog:
  config:
    url: "http://object.ws" 
    strval: ${random.value} # 产生随机字符串
    number: ${random.int} # 产生随机Int类型数值
    longnum: ${random.long} # 产生随机 Long类型数值
    test1: ${random.int[10]} # 产生10以内的的随机数
    test2: ${random.int[10,30]} # 产生10-30之间的随机数
    refval: ${blog.config.url}and${blog.config.strval} # 参数之间的互相引用

自定义配置项代码演示:

Spring Boot 为我们提供了许多默认的配置项,但是在开发的过程中,总是会有一些业务需要我们自定义配置,如下代码演示如何使用自定义配置:

示例代码:application.yml

blog:
  config:
    title: "柒索"
    subtitle: "一个头脑聪明,五肢发达的男人"
    url: "http://object.ws"
    number: ${random.int}

示例代码:BlogController.java

package ws.object.springboot.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class BlogController {

    @Value("${blog.config.title}")
    String Title;
    @Value("${blog.config.subtitle}")
    String subTitle;
    @Value("${blog.config.url}")
    String Url;
    @Value("${blog.config.number}")
    int Number;

    @RequestMapping(value = "/blog")
    public String Blog(){

        return  "  Title:"+Title+
                "  subTitle:"+subTitle+
                "  URL:"+Url+
                "  Number:"+Number;
    }
}

之后在浏览器输入http://localhost:8080/blog 就能看到配置在 .yml 文件中的值已经显示在页面里了。

Spring Boot - 多环境配置:

在现实的开发环境中,我们需要不同的配置环境,在不同环境下可以配置不同的参数文件,便于部署,提高效率减少出错率,常见配置格式为application-{profile}.properties,其中{profile}对应你的环境标识,比如:dev(开发环境)、test(测试环境)、vis(演示环境)、prod(生产环境)。

  • application-test.yml:测试环境
  • application-dev.yml:开发环境
  • application-prod.yml:生产环境

yml多文档块方式:

spring:
  profiles:
    active: prod #指定使用哪个环境

server:
  port: 8081

---
server:
  port: 8083

---
server:
  port: 8084

激活指定配置:

配置文件中指定:

如何使用?我们只需要在application.yml文件中加上:

spring:
 profiles:
   active: test

启动Spring Boot 应用是就会使用application-tst.yml配置文件 或者是属于application.yml中test代码块中的内容。

命令行指定:

在通过命令行启动程序的时候,可以追加启动参数:

java -jar spring-boot-config-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev

虚拟机参数:

在IDEA中启动项目的时候在配置中加入虚拟机启动参数:

-Dspring.profiles.active=dev

Spring Boot - 文件加载位置和顺序:

配置文件加载位置:

springboot 启动会扫描以下位置的application.properties或者application.yml文件作为Spring boot的默认配置文件:

  • file:./config/
  • file:./
  • classpath:/config/
  • classpath:/

优先级由高到底,高优先级的配置会覆盖低优先级的配置;

SpringBoot会从这四个位置全部加载主配置文件;互补配置

我们还可以通过spring.config.location来改变默认的配置文件位置

项目打包好以后,我们可以使用命令行参数的形式,启动项目的时候来指定配置文件的新位置;指定配置文件和默认加载的这些配置文件共同起作用形成互补配置;java -jar spring-boot-config-0.0.1-SNAPSHOT.jar --spring.config.location=~/desktop/application.properties

配置文件加载顺序:

把所有配置全都打在一个jar包里,显然不是最好的做法,更常见的做法是把配置文件放在jar包外面,可以在需要时,不动java代码的前提下修改配置,spring-boot会按以下顺序加载配置文件 application.properties或application.yml, 优先级从高到低;高优先级的配置覆盖低优先级的配置,所有的配置会形成互补配置:

  1. 所有的配置都可以在命令行上进行指定 java -jar demo.jar --server.port=8087多配置项使用空格分开

  2. 来自java:comp/env的JNDI属性

  3. Java系统属性(System.getProperties())

  4. 操作系统环境变量

  5. RandomValuePropertySource配置的random.*属性值

  6. jar包外部的application-{profile}.properties或application.yml(带spring.profile)配置文件

  7. jar包内部的application-{profile}.properties或application.yml(带spring.profile)配置文件

  8. jar包外部的application.properties或application.yml(不带spring.profile)配置文件

  9. jar包内部的application.properties或application.yml(不带spring.profile)配置文件

  10. @Configuration注解类上的@PropertySource

  11. 通过SpringApplication.setDefaultProperties指定的默认属性

参考官方文档-SpringBootConfig

总结:

  • 先查找jar文件同级目录下的 ./config 子目录 有无配置文件 (外置)
  • 再查找jar同级目录 有无配置文件(外置)
  • 再查找config这个package下有无配置文件(内置)
  • 最后才是查找classpath 下有无配置文件(内置)

Spring Boot - 常见参数配置:

Spring.io-Sring Boot常见配置属性列表

参考资料: