文章目录

  • 二、配置文件
  • 2.1 配置文件
  • 2.2 YAML语法
  • 2.2.1 基本语法
  • 2.2.2 值的写法
  • 2.2.2.1 普通的值(数字、字符串、布尔)
  • 2.2.2.2 对象、Map(属性和值、键值对)
  • 2.3 配置文件注入
  • 2.3.1 @Value获取值和@ConfigurationProperties获取值比较
  • 2.3.2 配置文件注入值数据校验 @Validated
  • 2.3.3 @PropertySource/@ImportResource/@Bean
  • 2.4 配置文件占位符
  • 2.4.1 随机数
  • 2.4.2 获取之前配置的值
  • 2.5 Profile
  • 2.5.1 多profile文件
  • 2.5.2 yml支持多文档块的方式
  • 2.5.4 激活指定profile
  • 2.6 配置文件加载顺序
  • 2.7 外部配置加载顺序



欢迎访问笔者个人技术博客:

http://rukihuang.xyz/

二、配置文件

2.1 配置文件

  • SpringBoot使用一个全局配置文件,配置文件名是固定
  • application.properties
  • application.yml
  • 作用:由于SpringBoot在底层已经帮助我们自动配置了,而配置文件则帮助修改SpringBoot自动配置的默认值。

2.2 YAML语法

2.2.1 基本语法

  • k: v:表示一对键值对(空格必须有)
  • 以空格的缩进来控制层级关系,只要左对齐的一列数据,都是同一个层级的
  • 属性和值都是大小写敏感的
person:
  name: 张帅
  age: 18
  birth: 1998/12/01
  boss: false
  friends:
    - 张三
    - 李四
    - 王五
  map:
    k1: v1
    k2: v2
  pet:
    name: doggy
    age: 2

2.2.2 值的写法

2.2.2.1 普通的值(数字、字符串、布尔)
  • k: v:字面直接来写
  • 字符串默认不用加上单引号或双引号
  • "":双引号,不会转义(有特殊)字符串里面的特殊字符;特殊字符会作为本身想表示的意思
  • name: "zhangsan \n lisi":输出为zhangsan 换行 lisi
  • '':单引号,会转义特殊字符,特殊字符最终只是一个普通的字符串数据
  • name: 'zhangsan \n lisi':输出为zhangsan \n lisi
2.2.2.2 对象、Map(属性和值、键值对)
  • 对象还是k: v的方式
person:
  map:
    k1: v1
    k2: v2
  pet:
    name: doggy
    age: 2
  • 行内写法
pet: {name: doggy, age: 2}

2.3 配置文件注入

  • 配置文件:application.yaml
person:
  name: 张帅
  age: 18
  birth: 1998/12/01
  boss: false
  friends:
    - 张三
    - 李四
    - 王五
  map:
    k1: v1
    k2: v2
  pet:
    name: doggy
    age: 2
  • javaBean:Person
/**
 * 将配置文件中配置的每一个属性的值,映射到这个组件中
 * @ConfigurationProperties:告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定;
 *      prefix = "person":配置文件中哪个下面的所有属性进行一一映射
 *
 * 只有这个组件是容器中的组件,才能容器提供的@ConfigurationProperties功能;
 *
 */
@Component //注解表明一个类会作为组件类,并告知Spring要为这个类创建bean
@ConfigurationProperties(prefix = "person")
public class Person {
    private String name;
    private int age;
    private Date birth;
    private boolean boss;
    private List<String> friends;
    private Map<String, String> map;
    private Dog pet;
  • @Component@Bean的区别
  • @Component注解表明一个类会作为组件类,并告知Spring要为这个类创建bean。
  • @Bean注解告诉Spring这个方法将会返回一个对象,这个对象要注册为Spring应用上下文中的bean。通常方法体中包含了最终产生bean实例的逻辑。
  • 在pom文件中添加依赖,编写配置就会有提示
<!--导入配置文件处理器,配置文件进行绑定就会有提示-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
</dependency>

2.3.1 @Value获取值和@ConfigurationProperties获取值比较

@ConfigurationProperties

@Value

功能

批量注入配置文件中的属性

一个个指定

松散绑定(松散语法)

支持

不支持

SpEL

不支持

支持

JSR303数据校验

支持

不支持

复杂类型封装

支持

不支持

  • yml和properties文件都能获取到值
  • 如果只需要获取配置文件中的某个单个的值,使用@Value
  • 如果专门编写了javaBean来和配置文件进行映射,使用@ConfigurationProperties

2.3.2 配置文件注入值数据校验 @Validated

@Component
@ConfigurationProperties(prefix = "person")
@Validated
public class Person {

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

   //lastName必须是邮箱格式
    @Email
    //@Value("${person.last-name}")
    private String lastName;
    //@Value("#{11*2}")
    private Integer age;
    //@Value("true")
    private Boolean boss;

    private Date birth;
    private Map<String,Object> maps;
    private List<Object> lists;
    private Dog dog;
  • 加入@Validated注解后,可以使用格式注解,对注入的数据进行校验

2.3.3 @PropertySource/@ImportResource/@Bean

  • @PropertySource:加载指定的配置文件
@Component
@PropertySource(value = {"classpath:person.properties"})
@ConfigurationProperties(prefix = "person")
public class Person {
    private String name;
    private int age;
    private Date birth;
    private boolean boss;
    private List<String> friends;
    private Map<String, String> map;
    private Dog pet;
person.name=张三
person.age=18
person.boss=false
person.birth=1998/2/5
person.friends=a,b,c
person.map.k1=v1
person.map.k2=v2
person.pet.name=doggy
person.pet.age=2
  • @ImportResource:导入spring的配置文件,让配置文件中的内容生效,且必须标注砸一个配置类上(@Configuration
@ImportResource(locations = {"classpath:beans.xml"})
@SpringBootApplication
public class SpringBootPrac02Application {
<!--bean.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="helloService" class="com.ruki.springboot.service.HelloService"></bean>
</beans>
  • SpringBoot推荐使用全注解方式给容器添加组件
  • @Configuration配置类:Spring配置文件
  • @Bean给容器中添加组件
/**
 * @Configuration:指明当前类是一个配置类;就是来替代之前的Spring配置文件
 *
 * 在配置文件中用<bean><bean/>标签添加组件
 *
 */
@Configuration
public class MyAppConfig {

    //将方法的返回值添加到容器中;容器中这个组件默认的id就是方法名
    @Bean
    public HelloService helloService02(){
        System.out.println("配置类@Bean给容器中添加组件了...");
        return new HelloService();
    }
}

2.4 配置文件占位符

2.4.1 随机数

  1. ${random.value}
  2. ${random.int}
  3. ${random.long}
  4. ${random.int(10)}
  5. ${random.int[1024,65536]}

2.4.2 获取之前配置的值

  • 如果没有可以指定默认值
person.last-name=张三${random.uuid}
person.age=${random.int}
person.birth=2017/12/15
person.boss=false
person.maps.k1=v1
person.maps.k2=14
person.lists=a,b,c
person.dog.name=${person.hello:hello}_dog
person.dog.age=15

2.5 Profile

  • 实际开发中存在多种环境
  • dev:开发
  • prod:生产
  • test:测试

2.5.1 多profile文件

  • 因此主配置文件会随着不同的生产环境而产生多个文件
  • application-{profile}.properties

2.5.2 yml支持多文档块的方式

  • 使用三条短线---分隔文档块
server:
  port: 8081
spring:
  profiles:
    active: prod #激活prod生产环境,因此端口为8084

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


---

server:
  port: 8084
spring:
  profiles: prod  #指定属于哪个环境

2.5.4 激活指定profile

  1. 在配置文件中指定spring.profiles.active=dev
  2. 命令行:在最后加上--spring.profiles.active=dev
java -jar spring-boot-02-config-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev;
  1. 虚拟机参数 vmoption:-Dspring.profiles.active=dev

2.6 配置文件加载顺序

  • springboot启动会扫描一下位置的application.propertiesapplication.yml文件作为默认配置文件

位置

描述

优先级

file:./config/

工程项目/config


file:./

工程项目

较高

classpath:/config/

resources/config

较低

classpath:/

resources


  • 优先级由高到底,高优先级的配置会覆盖低优先级的配置;
  • SpringBoot会从这四个位置全部加载主配置文件;互补配置

2.7 外部配置加载顺序

  • SpringBoot也可以从以下位置加载配置; 优先级从高到低;高优先级的配置覆盖低优先级的配置,所有的配置会形成互补配置
  1. 命令行参数:所有的配置都可以在命令行上进行指定
  1. java -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar --server.port=8087 --server.context-path=/abc
  2. 多个配置用空格分开; --配置项=值
  1. 来自java:comp/env的JNDI属性
  2. Java系统属性(System.getProperties())
  3. 操作系统环境变量
  4. RandomValuePropertySource配置的random.*属性值

由jar包外向jar包内进行寻找;

优先加载带profile

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

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

再来加载不带profile

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

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

10.@Configuration注解类上的@PropertySource

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

所有支持的配置加载来源;