目录

 

Spring Boot的配置文件

YAML语法格式

YAML基本语法

YMAL常用写法

字面量: 数值,字符串,布尔,日期

 对象 & Map

数组(List、Set)

yaml 配置文件注入值

properties 配置文件注入值

比较@Value和@ConfifigurationProperties获取值

JSR303数据校验_配置文件注入的值


加载指定配置文件

@PropertySource加载局部配置文件

@ImportResource 使用xml配置

自定义配置类向容器注入组件(springboot推荐使用)

Profifile 多环境支持

Profifile介绍

properties 文件演示案例

yml 文件演示案例

配置文件加载位置


Spring Boot的配置文件

  • Spring Boot 使用一个全局配置文件,放置在src/main/resources目录或类路径的/config下;当然放在不同位置的优先级是不一样的。后面会学习。

spring boot 参数 value 参数不存在 springboot参数配置_配置文件

  • 配置文件的作用:修改 Spring Boot 自动配置的默认值;
  • yml 是 YAML(YAML Ain't Markup Language)不是一个标记语言;
  • 标记语言:以前的配置文件;大多都使用的是xxxxx.xml文件。
<server>
    <port>8081</port>
</server>
  • YAML:以数据为中心,配置数据的时候具有面向对象的特征;比 json、xml 等更适合做配置文件;可以理解为类:属性

 

server:
    port:8081

YAML语法格式

YAML基本语法

  • key: value 表示一对键值对(冒号后面必须要有空格)
  • 使用空格缩进表示层级关系
  • 左侧缩进的空格数目不重要,只要同一层级的元素左侧对齐即可
  • key 与 value 大小写敏感

spring boot 参数 value 参数不存在 springboot参数配置_配置文件_02

spring boot 参数 value 参数不存在 springboot参数配置_加载_03

YMAL常用写法

字面量: 数值,字符串,布尔,日期


字符串 默认不用加上引号;


  • 使用 双引号 不会转义特殊字符,特殊字符最终会转成本来想表示含义输出
  • name: "hello \n world" 输出: hello 换行 world
  • 使用 单引号 会转义特殊字符,特殊字符当作一个普通的字符串输出
  • name: 'hello \n world' 输出:hello \n world

对象 & Map

分行写法:key: value value存储对象,每个值换一行写,注意值要左对齐

emp:
  name: xiaoming
  age: 22
  salary: 5000

行内写法:

emp: {name: xiaoming, age: 22, salary: 5000}

推荐分行写法,清晰易读。

数组(List、Set)

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

fortes:
  - java
  - python
  - hadoop

行内写法

fortes: [java,python,hadoop]

yaml 配置文件注入值

我们写如下的pojo

@Component
@ConfigurationProperties(prefix = "emp")
public class Emp {
    private String name;
    private Integer age;
    private Double salary;
    private Boolean boss;
    private Date birthday;

    private Map map;
    private List list;
    getter and setter ………………



}


1、@ConfifigurationProperties 告诉SpringBoot将配置文件中对应属性的值,映射到这个组件类中,进行一一绑定


prefifix = "emp":配置文件中的前缀名,哪个前缀与下面的所有属性进行一一映射


2、@Component 必须将当前组件作为SpringBoot中的一个组件,才能使用容器提供的 @ConfifigurationProperties功能;


 


配置文件:


server:
  port: 8081
  servlet:
    context-path: /yamlTest

emp:
  name: zhangsan
  age: 22
  salary: 8000
  boss: true
  birthday: 1991/10/10
  map:
    key1: value1
    key2: value2
  list:
    - one
    - two
    - three

测试类:

@SpringBootTest
class DemoApplicationTests {

    @Autowired
    Emp emp;
    @Test
    void contextLoads() {
        System.out.println(emp);
    }

}

spring boot 参数 value 参数不存在 springboot参数配置_spring_04

注意:如果提示没有发现配置文件处理器,则加入以下依赖。

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

properties 配置文件注入值

我们将application.yml文件内容注释掉,编写application.properties

#配置emp的值
emp.name=李四
emp.age=30
emp.birthday=1989/9/12
emp.boss=false
emp.salary=9000
emp.map.key1=value1
emp.map.key2=value2
emp.list=one, two, three

spring boot 参数 value 参数不存在 springboot参数配置_spring_05

乱码解决:

spring boot 参数 value 参数不存在 springboot参数配置_配置文件_06

结果:

spring boot 参数 value 参数不存在 springboot参数配置_spring boot_07

比较@Value和@ConfifigurationProperties获取值

使用@Value获取值,先把类中的@ConfifigurationProperties注释掉。

@Component
//@ConfigurationProperties(prefix = "emp")
public class Emp {
    @Value("${emp.name}")
    private String name;

    @Value("#{121*2}")
    private Integer age;
    
    @Value("1000")
    private Double salary;
    private Boolean boss;
    private Date birthday;

………………

spring boot 参数 value 参数不存在 springboot参数配置_spring_08


总结 @Value 与 @ConfifigurationProperties 获取值的差异


 

@ConfifigurationProperties

@Value

样例

实现功能

 

 

 

松散绑定

支持

不支持

last_name==lastName



last-name ==lastName

SpEL

不支持

支持

#{10*2}

复杂类型封装

支持

不支持

${emp.map}

JSR303 数据校验

支持

不支持

下文样例

JSR303数据校验_配置文件注入的值


校验是否为合法的邮箱地址 :


  • 取消 @ConfifigurationProperties(prefifix = "emp") 前面的注释
  • 在Emp 类上添加 @Validated 数据校验注解
  • 在 name 属性上添加 @Email 注解
  • 验证 @ConfifigurationProperties 会进行校验, 而 @Value 不会进行校验值
@Component
@ConfigurationProperties(prefix = "emp")
@Valid
public class Emp {
    @Email
    private String name;
    private Integer age;
    private String birthday;
    private Boolean boss;
    private Double salary;

    private Map map;
    private List list;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
…………
}

加载指定配置文件

@PropertySource加载局部配置文件


@ConfifigurationProperties 默认从全局配置文件 (application.properties/application.yml) 中获取值 ,


所有配置数据写在全局配置文件中,显得太臃肿了 , 可将它们抽取出来,放到其他局部配置文件中。


 


@PropertySource :用于加载局部配置文件 ;


1. 将 全局配置文件 中的 emp 相关配置数据 抽取 到 resources/ emp.properties 文件中


 




spring boot 参数 value 参数不存在 springboot参数配置_spring_09


2. @PropertySource :加载指定的配置文件 ; value 属性是数组类型 , 用于指定文件位置,其余不变。


@PropertySource(value = {"classpath:emp.properties"})
@Validated
@Component
@ConfigurationProperties(prefix = "emp")
public class Emp {


………………
}

@ImportResource 使用xml配置


SpringBoot 提倡零配置, 即无 xml 配置,但是在实际开发中,可能有一些特殊要求必须使用 xml 配置;


这时我们可以通过 Spring 提供的 @ImportResource 来加载 xml 配置文件。


 


@ImportResource :加载 Spring 的 xml配置文件内容加载到容器中使用;


我们创建一个业务类。


public class EmpService {
    public void add(){
        System.out.println("add()....");
    } 
}


创建 resources/spring01.xml 文件,添以下内容


<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="empService" class="com.example.demo.service.EmpService">
    </bean>

</beans>

spring boot 参数 value 参数不存在 springboot参数配置_配置文件_10


spring boot 参数 value 参数不存在 springboot参数配置_spring_11

spring boot 参数 value 参数不存在 springboot参数配置_spring boot_12

自定义配置类向容器注入组件(springboot推荐使用)


Spring Boot 推荐使用注解的方式向容器中注入组件 , 操作如下:


  • 使用 @Confifiguration(写到类上面,相当于表示这是一个xml配置文件) 配置类,来表示对应Spring配置文件(xml文件)。
  • 使用 @Bean 向容器中注入组件对象(写到方法上面,表示这是向容器中注入的一个组件)。
  • 把上面 @importResource 注解注释掉测试。
package com.example.demo.config;

import com.example.demo.service.EmpService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class EmpConfig {

    @Bean
    public EmpService empService() {
        System.out.println("@Bean 注入组件");
        return new EmpService();
    }
}
@SpringBootTest
class DemoApplicationTests {

    @Autowired
    Emp emp;

    @Autowired
    ApplicationContext context;

    @Test
    void contextLoads() {
        System.out.println(emp);
    }

    @Test
    void empSerrviceTest() {

        System.out.println("empService: " + context.getBean("empService"));//方法的名字
    }

}

spring boot 参数 value 参数不存在 springboot参数配置_spring_13

Profifile 多环境支持

Profifile介绍


Profifile 是 Spring 用来针对不同的环境要求,提供不同的配置支持, 全局 Profifile 配置使用的文件名可以是


application-{profifile}.properties / application-{profifile}.yml ;


 


如 : application-dev.properties / application-prod.properties


 


演示案例:我们的项目环境分为 开发 ( dev )和 生产( prod )环境 ,开发环境下端口号为 8081


生产环境下端口号为8082


properties 文件演示案例

spring boot 参数 value 参数不存在 springboot参数配置_加载_14

spring boot 参数 value 参数不存在 springboot参数配置_spring_15

 

第一次:

spring boot 参数 value 参数不存在 springboot参数配置_配置文件_16

结果:

spring boot 参数 value 参数不存在 springboot参数配置_加载_17

 

第二次:

spring boot 参数 value 参数不存在 springboot参数配置_配置文件_18

结果:

spring boot 参数 value 参数不存在 springboot参数配置_加载_19

 

yml 文件演示案例

yml主配置文件同理,另外yml配置文件支持多文档快方式,如下:

server:
  port: 8080 #默认端口
spring:
  profiles:
    active: dev


---
server:
  port: 8083
spring:
  profiles: dev

---
server:
  port: 8084
spring:
  profiles: prod

运行结果:

spring boot 参数 value 参数不存在 springboot参数配置_spring boot_20

此外我们打成jar包命令行运行的时候也可以指定,例如:


java -jar demo-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev


配置文件加载位置

springboot启动时,会扫描以下位置的 application.properties 或者 application.yml 文件作为 Spring Boot的


默认配置文件 :


配置文件的位置

说明

fifile:./config/

当前项目的 confifig 目录下(最高级别)

fifile:./

当前项目的根目录下

classpath:/config/

类路径的 confifig 目录下

classpath:/

类路径的根目录下(最低级别)

 


请看下图:

spring boot 参数 value 参数不存在 springboot参数配置_加载_21


推荐把配置文件写在第三级别classpath:/config/下

 

如果您觉得,对您有帮助,请点个赞,感谢~~~