SpringBoot2.X系列:SpringBoot配置文件详解(4)

前言

Spring Boot配置文件对Spring Boot来说就是入门和基础,经常会用到,基于这一点也必须要普及一下这方面知识点,所以写下做个总结以便日后查看。

配置文件

在我们创建一个新的SrpingBoot项目时,在resources目录下给我们一个默认的全局配置文件 application.properties,打开会发现是一个空的文件,就算我们啥都不配置,一样能启动项目,其实Spring Boot在底层已经把配置都给我们自动配置好了,当在配置文件进行配置时,会修改SpringBoot自动配置的默认值。

配置文件名是固定的 application.properties 但我们可以修改为 application.yml 这两个文件本质是一样的,它们的区别只是其中的语法有点区别。

application.properties语法

application.properties 配置文件很好理解,通过 = 相接,形式如下:

key = value

application.yml语法

application.yml 配置文件使用YMAL语言,YMAL不是如XML般的标记语言,它甚至更适合做配置文件。

下面说下如何去规范书写。

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

配置文件值的规范书写

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

1、直接写,字符串 默认不用加上引号

# properties 写法
user.lastName=Xiang
# yaml 写法
user:
  lastName: Xiang

2、 "" 使用 双引号 不会转义特殊字符,特殊字符最终会转成本来想表示含义输出

user.lastName="Xiang \n Name"
user:
  lastName: "Xiang \n Name"

输出: Xiang 换行 Name

3、'' 使用 单引号 会转义特殊字符,特殊字符当作一个普通的字符串输出

user:
  lastName: 'Xiang \n Name'

输出: Xiang \n Name

1.2、对象&Map(属性和值)(键值对)

Map语法都是 key、value 形式

# properties 语法
maps.lastName=Xiang
maps.age=18
# yaml 语法
maps:
  lastName: Xiang
  age: 18
  key: value
# yaml 行内语法
maps: {lastName: Xiang, age: 18}
1.3、 数组(List、Set)

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

# properties 写法
user.list[0]=1
user.list[1]=2
user.list[2]=3
# yaml 写法
user:
  list:
    - 1
    - 2
    - 3
# yaml 行内写法
user:
  list: [1,2,3]

温馨提醒:

关于行内写法请注意一下 当前属性是否是第一级(有没有父级),可以观察一下

person:
list: [1,2,3]

和上面写的

maps: {lastName: Xiang, age: 18}

获取配置文件属性值

有时候我们需要在java类获取到配置文件的值,Spring Boot提供自定义配置组件,继续来写一个规范的配置文件。

一、@ConfigurationProperties 获取值

1、 编写JavaBean

/**
 * @author Xiang
 **/
@Component
@ConfigurationProperties(prefix = "user")
public class UserBean {
    private String lastName;
    private Integer age;
    private Map<String,String> maps;
    private List<Integer> list;
    getter/setter……
}

2、 编写 Yaml 文件

user:
  lastName: Xiang
  age: 18
  list:
    - 1
    - 2
    - 3
  maps:
    key1: value1
    key2: value2

@ConfigurationProperties 注解向Spring Boot声明该类中的所有属性和配置文件中相关的配置进行绑定。

  • prefix = “user”:声明配置前戳,将该前戳下的所有属性进行映射。

@Component 或者@Configuration:将该组件加入Spring Boot容器,只有这个组件是容器中的组件,配置才生效。

3、 单元测试是否能打印配置文件值

  • 使用 SpringBoot 单元测试类进行测试

image-20210726115647436

二、@Value 获取值

UserBean 的各个属性上加上 @Value 注解也可以得到配置文件的值

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.Map;

/**
 * @author Xiang
 **/
@Component
// 注释掉了
//@ConfigurationProperties(prefix = "user")
public class User1Bean {
    @Value("${user1.lastName}")
    private String lastName;
    @Value("${user1.age}")
    private Integer age;
    @Value("#{${user1.maps}}")
    private Map<String,String> maps;
    @Value("#{'${user1.list}'.split(',')}")
    private List<Integer> list;
}

application.yml 配置文件也要更改为行内语法

user1:
  lastName: Xiang
  age: 18
  list: 1,2,3
  maps: '{"key1":"value1","key2":"value2"}'
  • 总结 使用场景,如果只是在某个业务逻辑中需要获取配置文件中的某个属性值,就使用 @Value

自定义配置文件

除了在默认的application文件进行属性配置,我们也可以自定义配置文件,上面用的是yaml配置文件,这里就新建 person.properties ,配置内容如下

user.lastName=Xiang
user.age=18
user.list=1,2,3
user.maps.key1=value1
user.maps.key2=value2

1、编写 PersonBean

@Configuration
@ConfigurationProperties(prefix = "person")
@PropertySource(value = "classpath:person.properties")
public class PersonBean {
    private String lastName;
    private Integer age;
    private Map<String,String> maps;
    private List<Integer> list;
}

和前面的 UserBean 配置大体一样,可以看前面的注解详解,解释一下 @PropertySource

  • @PropertySource 用于加载局部配置文件, 加载指定的配置文件; value 属性是数组类型, 用于指定文件位置

运行后,发现 properties 文件在 idea 上中文乱码, 进行如下设置就会不会乱码

image-20210726142453909

2、单元测试结果

image-20210726144640162

Profile多环境支持

  • Profile 是 Spring 用来针对不同的环境要求,提供不同的配置支持, 全局 Profile 配置使用的文件名可以是
    application-{profile}.properties / application-{profile}.yml ;
    • 如: application-dev.yml/ application-prod.yml

1、applicaiton-dev/prod.yml文件演示案例

创建两个文件 application-dev.ymlapplication-prod.yml

image-20210726160026709

image-20210726155908254

激活指定profile

  • 在主配置文件 application.yml中指定 spring.profiles.active=dev

image-20210726160254883

  • 未指定哪个profile文件时, 默认使用 application.yml中的配置 。

单元测试 age 是否是 dev 文件的值

image-20210726161129284

2、 多种方式激活指定profile

  • 方式1:在主配置文件中指定
# properties 配置方式
spring.profiles.active=dev

# yaml 配置方式
spring:
  profiles:
    active: dev
  • 方式2::命令行参数指定
    • idea启动时,配置传入命令行参数 --spring.profiles.active=dev

image-20210726162431551

  • jar包运行命令参数
java -jar learn-1.0.jar --spring.profiles.active=dev
  • 方式3: 虚拟机参数指定
-Dspring.profiles.active=dev

image-20210726162846542

  • 方式4:Maven环境指定

Pom 文件添加 profiles

<profiles>
    <profile>
        <id>dev</id>
        <properties>
            <!-- 环境标识,需要与配置文件的名称相对应 -->
            <profiles.active>dev</profiles.active>
        </properties>
        <activation>
            <!-- 默认环境 -->
            <activeByDefault>true</activeByDefault>
        </activation>
    </profile>
    <profile>
        <id>prod</id>
        <properties>
            <profiles.active>prod</profiles.active>
        </properties>
    </profile>
</profiles>

然后在 application.yml 文件中设置 环境 @profiles.active@

spring:
  profiles:
    active: @profiles.active@

maven 刷新后会出现 Profiles选项

image-20210726164724645

配置文件加载位置

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

配置文件位置说明
file:./config/当前项目的config目录下(最高级别)
file:./当前项目的根目录下
classpath:/config/类路径的config目录下
classpath:/类路径的根目录下(最低级别)

以上按照优先级从高到低的顺序,将所有位置的配置文件全部加载,高优先级的配置内容会覆盖低优先级的
配置内容。

项目打包好以后,我们可以使用命令行参数的形式,启动项目的时候来指定配置文件的新位置;指定配置文件和默认加载的这些配置文件共同起作用形成互补配置;

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

java -jar learn-1.0.jar --spring.config.location=E:/application.properties

以上就是今天的配置详解,有什么没有说到的或者还有问题的欢迎评论区讨论留言!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值