Spring Boot系列二 配置文件

运行环境:JDK 7 或 8,Maven 3.0+

技术栈:SpringBoot 2.5+

一、自动配置

Spring Boot 提供了对应用进行自动化配置。相比以前 XML 配置方式,很多显式方式申明是不需要的。二者,大多数默认的配置足够实现开发功能,从而更快速开发。

什么是自动配置

Spring Boot 提供了默认的配置,如默认的 Bean ,去运行 Spring 应用。它是非侵入式的,只提供一个默认实现。

大多数情况下,自动配置的 Bean 满足了现有的业务场景,不需要去覆盖。但如果自动配置做的不够好,需要覆盖配置。比如通过命令行动态指定某个 jar ,按不同环境启动,这里先要考虑到配置的优先级。

Spring Boot 不单单从 application.properties 获取配置,所以我们可以在程序中多种设置配置属性。按照以下列表的优先级排列:

1.命令行参数

2.java:comp/env 里的 JNDI 属性

3.JVM 系统属性

4.操作系统环境变量

5.RandomValuePropertySource 属性类生成的 random.* 属性

6.应用以外的 application.properties(或 yml)文件

7.打包在应用内的 application.properties(或 yml)文件

8.在应用 @Configuration 配置类中,用 @PropertySource 注解声明的属性文件

9.SpringApplication.setDefaultProperties 声明的默认属性

可见,命令行参数优先级最高。这个可以根据这个优先级,可以在测试或生产环境中快速地修改配置参数值,而不需要重新打包和部署应用。

还有第 6 点,根据这个在多 moudle 的项目中,比如常见的项目分 api 、service、dao 等 moudles,往往会加一个 deploy moudle 去打包该业务各个子 moudle,应用以外的配置优先。

二、自定义属性

接下来按着代码工程来讲解知识。

在 application.properties 中对应 HomeProperties 对象字段编写属性的 KV 值:

## 家乡属性
home.province=anhui
home.city=tongcheng
home.desc=dev: I'm living in ${home.province} ${home.city}.

这里也可以通过占位符,进行属性之间的引用。

然后,编写对应的 HomeProperties Java 对象:

package com.learn.springboot.property;

import org.springframework.boot.context.properties.ConfigurationProperties;

import org.springframework.stereotype.Component;

@Component

@ConfigurationProperties(prefix = "home")

public class HomeProperties {

    /**

     * 省份

     */

    private String province;

    /**

     * 城市

     */

    private String city;

    /**

     * 描述

     */

    private String desc;

    public String getProvince() {

        return province;

    }

    public void setProvince(String province) {

        this.province = province;

    }

    public String getCity() {

        return city;

    }

    public void setCity(String city) {

        this.city = city;

    }

    public String getDesc() {

        return desc;

    }

    public void setDesc(String desc) {

        this.desc = desc;

    }

    @Override

    public String toString() {

        return "HomeProperties{" +

                "province='" + province + '\'' +

                ", city='" + city + '\'' +

                ", desc='" + desc + '\'' +

                '}';

    }

}

通过 @ConfigurationProperties(prefix = “home”) 注解,将配置文件中以 home 前缀的属性值自动绑定到对应的字段中。同是用 @Component 作为 Bean 注入到 Spring 容器中。

如果不是用 application.properties 文件,而是用 application.yml 的文件,对应配置如下:

## 家乡属性
home:
 
province: 安徽省
 
city: 桐城市
 
desc: 我家住在${home.province}的${home.city}

键值对冒号后面,必须空一格。

注意:

1、application.properties 配置中文值的时候,读取出来的属性值会出现乱码问题。但是 application.yml 不会出现乱码问题。原因是,Spring Boot 是以 iso-8859 的编码方式读取 application.properties 配置文件。

2、相同属性配置时加载的优先级:

bootstrap.properties优先于application.prperties

properties优先于yml

resources/config优先于resources/

三、random.* 属性

Spring Boot 通过 RandomValuePropertySource 提供了很多关于随机数的工具类。概括可以生成随机字符串、随机 int 、随机 long、某范围的随机数。

运行UserPropertiesTest 测试类,多次运行,可以发现每次输出不同 User 属性值:

UserProperties{id=1421411486685028326, age=26, desc='冬天叫做796910b1cd18e5115395c425eb7850ed', uuid='e5ac7b01-7d94-40d1-8faf-cc55609a7e2f'}

application.yml 方式的配置如下:

user:
 
id: ${random.long}
 
age: ${random.int[1,200]}
 
desc: 冬天叫做${random.value}
 
uuid: ${random.uuid}

四、多环境配置

很多场景的配置,比如数据库配置、Redis 配置、注册中心和日志配置等。在不同的环境,我们需要不同的包去运行项目。所以看项目结构,有两个环境的配置:

application-dev.yml:开发环境

application-prod.yml:生产环境

Spring Boot 是通过 application.yml 文件中,设置 spring.profiles.active 属性,比如 ,配置了 dev ,则加载的是 application.yml :

spring:
 
profiles:
   
active: dev

那运行 springboot工程中 Application 应用启动类,从控制台中可以看出,是加载了 application-dev.yml  的属性输出:

HomeProperties{province='江苏省', city='南京市', desc='我家住在南京市的南京市'}

将 spring.profiles.active 设置成 prod,重新运行,可得到 application-prod.properties的属性输出:

HomeProperties{province='北京市', city='北京市', desc='我家住在北京市的北京市'}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值