SpringBoot学习历程(二):配置文件详解

前言

  • 本人github仓库地址:https://github.com/RabbitsInTheGrass/springBoot-Learning
  • springboot提供了外部化配置的功能,可以在不同环境中使用相同的应用程序代码,我们可以使用属性文件,YAML文件,环境变量和命令行参数来外部化配置。
  • 参考官网文档:https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html

1. 配置文件

SpringBoot使用一个全局的配置文件,配置文件名是固定的,一般是
•application.properties 或者 •application.yml。
  配置文件的作用:修改SpringBoot自动配置的默认值。

2. 读取配置信息

属性值可以通过:

2.1 @Value注解

用@Value注解直接映射属性值到bean上。
在application.yml 配置如下:

rabbits:
  user:
   name: 张三

新增一个用户类

package com.rabbits.learn.model;

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

/**
 * @Description User类
 * @Author RabbitsInTheGrass_xj
 * @Date 2019-10-02 15:36
 */
@Component
public class User {

    @Value("${rabbits.user.name}")
    private String name;

    public String getName() {
        return name;
    }

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

新增HomeController类

package com.rabbits.learn.controller;

import com.rabbits.learn.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @Description HomeController类
 * @Author RabbitsInTheGrass_xj
 * @Date 2019-10-12 15:41
 */
@RestController
public class HomeController {

    @Autowired
    private User user;

    @RequestMapping("/")
    String home() {
        return user.getName();
    }

}

启动服务,访问http://localhost:8080/ 可以看到页面输出张三;

2.2 通过Spring的访问Environment抽象

2.3 @ConfigurationProperties注解

使用 @ConfigurationProperties 注解需要引入配置文件处理器依赖。

<!--引入@ConfigurationProperties注解所需配置文件处理器-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
</dependency>

上边的栗子就可以改成

@Component
@ConfigurationProperties(prefix = "rabbits.user")
public class User2 {

    private String name;

    public String getName() {
        return name;
    }

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

}

prefix = “rabbits.user” 和配置文件的属性名一一对应;

@RestController
public class HomeController {

    @Autowired
    private User user;

    @Autowired
    private User2 user2;

    @RequestMapping("/")
    String home() {
        return user.getName() + "***" + user2.getName();
    }

}

2.4 @PropertySource注解

通过@PropertySource:加载指定的配置文件。
@Configuration
@ImportResource:导入Spring的配置文件,让配置文件里面的内容生效;

2.5 SpringBoot推荐

SpringBoot推荐给容器中添加组件的方式推荐使用全注解的方式:
1、配置类**@Configuration**------>Spring配置文件
2、使用**@Bean**给容器中添加组件

注意:
 @Value获取值和@ConfigurationProperties获取值比较如下:
 a. @Value是以前spring底层的,使用@Value需要一个一个参数指定,它支持SpEL表达式。
 b. @ConfigurationProperties批量注入配置文件中的属性,它支持宽松绑定规则,支持元数据,支持JSR303数据校验和复杂类型封装。

3. 外部配置加载顺序

Spring Boot使用一个非常特殊的PropertySource顺序,该顺序旨在允许合理地覆盖值。按以下顺序考虑属性:

  1. 主目录上的Devtools全局设置属性(~/.spring-boot-devtools.properties当devtools处于活动状态时)。
  2. @TestPropertySource 测试中的注释。
  3. properties测试中的属性。可用于测试应用程序的特定部分@SpringBootTest的测试注释和注释。
  4. 命令行参数。
  5. 来自的属性SPRING_APPLICATION_JSON(嵌入在环境变量或系统属性中的嵌入式JSON)。
  6. ServletConfig 初始化参数。
  7. ServletContext 初始化参数。
  8. java:comp/env的JNDI属性。
  9. Java系统属性(System.getProperties())。
  10. 操作系统环境变量。
  11. RandomValuePropertySource配置的random.*属性值。
  12. 打包的jar(application-{profile}.properties和YAML变体)之外的特定于配置文件的应用程序属性。
  13. 打包在jar中的特定于配置文件的应用程序属性(application-{profile}.properties和YAML变体)。
  14. jar包(application.properties和YAML变体)之外的应用程序属性。
  15. jar包中的应用程序属性(application.properties和YAML变体)。
  16. @Configuration类上的注释@PropertySource。
  17. 默认属性(通过设置指定SpringApplication.setDefaultProperties)。

4. YAML语法:

在*.yml 或者 *.yaml文件中,一般写法是k:(空格)v:表示一对键值对(空格必须有,以空格的缩进来控制层级关系);

  1. 普通值不需要加双引号(加单引号时会转义特殊字符,这时特殊字符只是一个普通的字符串);
  2. 对象、Map(键值对)类型:
    k: v的方式或者 k: {k1: v1,k2: v2}
  3. 数组(List、Set)类型:
    用- 值表示数组中的一个元素 或者 k: [v1,v2,v3]

5. 配置文件中的占位符

5.1 随机数

有时候我们想要参数不是一个固定的值,比如密钥、服务端口等。Spring Boot的属性配置文件中可以通过${random}来产生int值、long值或者string字符串,来支持属性的随机值。

com:
  test:
    string: ${random.value} # 随机字符串
    number: ${random.int} # 随机int
    longNum: ${random.long} # 随机long
    num1: ${random.int(10)} # 10以内的随机数
    num2: ${random.int[10,20]} # 10-20的随机数
    num3: ${random.uuid} #32位随机数  uuid

5.2 占位符

我们可以用占位符获取之前配置的值,如果没有可以用:指定默认值。例如:

com:
  test:
    number: ${random.int} # 随机int
    num4: ${com.test.number:123}

6. 多环境Profile配置

6.1 application-{profile}.properties/yml

Profile是SpringBoot对不同环境提供不同配置功能的支持,可以通过激活、 指定参数等方式快速切换环境 。在SpringBoot中多环境配置文件名需要满足application-{profile}.properties/yml的格式,其中{profile}对应你的环境标识,比如:
a. application-dev.yml:开发环境
b. application-test.yml:测试环境
c. application-prod.yml:生产环境
加载哪个具体的配置文件会被,需要在application.properties/yml文件中通过spring.profiles.active属性来设置,其值对应{profile}值。

6.2 激活指定profile

  1. 在配置文件application.properties/yml中指定 spring.profiles.active=dev
  2. 命令行: java -jar XXX.jar --spring.profiles.active=dev;
  3. 虚拟机参数:-Dspring.profiles.active=dev

7. 配置文件加载位置

springboot 启动会扫描以下位置的application.properties/yml文件作为Spring boot的默认配置文件
–file:./config/
–file:./
–classpath:/config/
–classpath:/
优先级由高到底,高优先级的配置会覆盖低优先级的配置;
也可以用spring.config.location来改变默认的配置文件位置。
也可以用命令行参数的形式。

8. 常用配置属性大全

太多了。。。。。。。点这个链接springboot配置文件属性大全

猜你喜欢

转载自blog.csdn.net/RabbitInTheGrass/article/details/101915798