暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

SpringBoot配置文件详解

我们家Java 2021-08-24
1152
点击上方蓝色我们家Java,选择“关注


通过前几篇文章的讲解,我们已经对SpringBoot有了一定的了解,接下来我们让一起学习一下SpringBoot的配置文件。SpringBoot需要使用一个全局的配置文件并且配置文件的名称是固定的。application.properties/application.yml配置文件能够修改SpringBoot自动配置的默认值,在底层帮我们自动配置好。


yaml:YMAL Ain’t markup language 是一种简洁的非标记语言,文件名后缀为yml或yaml均可,java中经常用它描述配置文件application.yml是一种数据序列化语言。


下面我们一起来看一个数据结构:
1一个宠物店有,猫 、狗 、猪
2这个宠物店叫JavaFamily
3店长有职称、 姓名两个属性 
4店员有一个真名一个昵称
5宠物除了名字和品种外还有父母的集合
6父母有品种和年龄两个属性

petStore:
  petStoreName: "JavaFamily"
  manager:
    title: doctor
    name: ya
  employee:
    name: 
      - a
      - b
  pet:
    name: p
    variety: keji
    parents:
      - variety: keji
        age: 2
      - variety: keji
        age: 4
我们要注意!冒号后面一定要有一个空格,同一级别的属性一定要对齐。其中店员有两个名字,我们使用了数组的写法。宠物的父母是两个对象,除了上述写法外,还有一种写法。
parents:
     - {variety: keji,age: 2}
     - {variety: keji,age: 4}
正常情况下配置值是不需要单引号或双引号的,只有碰到转移问题时才需要使用:
"Java \n Family" -> Java
                    Family
'Java \n Family' -> Java \n Family
yaml支持松散语法,无论是用驼峰标示,中划线还是下划线对于SpringBoot来说都是一样的。

占位符

当我们不清楚宠物的年龄时,可以先给他一个随机数来占位。
parents:
     - variety: keji
       age: ${random.int(10)}
给宠物的年龄一个不超过10的随机数。随机数占位符还有很多比如:
// 生成一个int,long型随机数...
${random.int
${random.long
...  
还有一种默认值写法:
pet:
  name${petStore.pet.name:p} 
这句的意思是,如果petStore.pet.name存在,则使用已经存在的值,否则默认为p。


在讲解yaml语法完成配置文件之后,我们需要将配置绑定到程序中的变量上,来影响程序的运行行为。


yaml配置绑定变量的两个注解:
@Value
@ConfigurationProperties


首先来看@Value注解:
在model中创建PetStore.java
package com.javafamily.familydemo.model;

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

@Data
@Component
public class PetStore {
    // 在应用启动时,自动将petStore.petStoreName属性的值绑定到私有变量petStoreName上面,实现赋值效果。
    @Value("${petStore.petStoreName}")
    private String petStoreName;

}
我们来一起测试一下,在test中的com.javafamily.familydemo中创建ValueTest.java
package com.javafamily.familydemo;

import com.javafamily.familydemo.model.PetStore;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit.jupiter.SpringExtension;

import javax.annotation.Resource;

@ExtendWith(SpringExtension.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
public class StoreTest {
    @Resource
    PetStore petStore;

    @Test
    public void hello() throws Exception {
        System.out.println(petStore.toString());
    }
}
运行测试类,我们得到了想要的结果:
麻烦的是,我们需要在每个变量上边都加上@Value注解,而@ConfigurationProperties注解就不会有这个问题。
package com.javafamily.familydemo.model;

import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Data
@Component
// @ConfigurationProperties注解不能使用驼峰写法
@ConfigurationProperties(prefix = "petstore")

public class PetStore {
    // 在应用启动时,自动将petStore.petStoreName属性的值绑定到私有变量petStoreName上面,实现赋值效果。
    // @Value("${petStore.petStoreName}")
    private String petStoreName;
    private Manager manager;
    private Employee employee;
    private Pet pet;
}

@Data
class Manager {
    private String title;
    private String name;
}

@Data
class Employee {
    private String[] name;
}

@Data
class Pet {
    private String name;
    private String variety;
    private Parents[] parents;
}

@Data
class Parents {
    private String variety;
    private Integer age;
}
petStore.java与application.yml中的数据结构是一模一样的。运行StoreTest.java:

配置文件还有一种以.properties为后缀写法。
application.properties的语法结构为key=value
application.yml的语法结构为key: value

两者除了写法不同,还有其他不同之处:yml是跨语言的,可以在包括java,go,python等大量的语言中使用,比如做云计算使用go和java的时候,可以通过配置中心使用同一份配置。properties只支持键值对数据,yml配置文件支持列表。


接下来我们再介绍一下bootstrap.yml(bootstrap.properties):bootstrap.yml应用于更加早期配置信息读取,可以使用它来配置application.yml中用到参数,语法与application.yml(application.properties)都是一样的。


最后再来看一下加载优先级:
如果application.yml 和bootstrap.yml 在同一目录下,则bootstrap.yml 的加载优先级要高于application.yml,即bootstrap.yml  会优先被加载。因为bootstrap.yml 用于应用程序上下文的引导阶段。由父SpringApplicationContext加载,比application配置文件优先加载,而application配置文件由子SpringApplicationContext加载,bootstrap加载的配置信息不能被application的相同配置覆盖。bootstrap.yml 可以理解成系统级别的一些参数配置,这些参数一般是不会变动的。
 
在正常情况下yml文件会比properties文件先加载,如果相同的配置存在于两个文件中。最后会使用properties中的配置因为最后读取的优先集最高。( 两个配置文件中的端口号不一样会读取properties中的端口号)
点击下方阅读原文,查看上一篇
文章转载自我们家Java,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论