SpringBoot配置文件

一、配置文件简介及加载优先级

  1. SpringBoot使用一个全局的配置文件,配置文件名是固定的;
    • application.properties
    • application.yml

    两种文件均可以作为配置文件,yml文件采取树状结构,更加清晰,至于如何选择全凭自己【以下将以yml配置文件为例

  2. YML文件的语法
    • 基本语法 [字面量:普通的值(数字,字符串,布尔)]

    a. k:(空格)v:表示一对键值对(空格必须有);

    b. 字符串默认不用加上单引号或者双引号;
    b.1 “”:双引号;不会转义字符串里面的特殊字符;特殊字符会作为本身想表示的意思

    name: "zhangsan \n lisi":输出;zhangsan 换行 lisi

    b.2 ”:单引号;会转义特殊字符,特殊字符最终只是一个普通的字符串数据

    name: ‘zhangsan \n lisi’:输出;zhangsan \n lisi
    //具体写法如下
    person:
      lastName: 张三
      age: 24
      boss: false
      birth: 1994/5/1
    
    #  maps: {k1: v1,k2: v2}
    
      maps:
        k1: v1
        k2: v2
    
    #  lists: [l1,l2,l3]
    
      lists:
        - l1
        - l2
        - l3
      dog:
        name: 蛋黄
        age: 2
    
    ---    //分界线:上下两部分相当于不同配置文件合并在一个文件中,可以看做是两个文档块的组合
    server:
      port: 8090
  3. 内部配置文件加载优先级
    springboot 启动会扫描以下位置的application.properties或者application.yml文件作为Spring boot的默认配置文件
    # 项目工程路径下[需注意此路径下配置文件打成jar包时,不会出现在jar包中]
    –file:./config/
    –file:./
    # src/main/resources路径下
    –classpath:/config/
    –classpath:/
    优先级由高到底,高优先级的配置会覆盖低优先级的配置;
    SpringBoot会从这四个位置全部加载主配置文件;互补配置;

二、配置文件值注入

  1. 准备工作
    a. 配置文件
    SpringBoot配置文件_第1张图片
    b. javaBean

    @Component
    public class Person {
        private String lastName;
        private Integer age;
        private Boolean boss;
        private Date birth;
        private Map maps;
        private List lists;
        private Dog dog;
    
        public String getLastName() {
            return lastName;
        }
    
        public void setLastName(String lastName) {
            this.lastName = lastName;
        }
    
        public Integer getAge() {
            return age;
        }
    
        public void setAge(Integer age) {
            this.age = age;
        }
    
        public Boolean getBoss() {
            return boss;
        }
    
        public void setBoss(Boolean boss) {
            this.boss = boss;
        }
    
        public Date getBirth() {
            return birth;
        }
    
        public void setBirth(Date birth) {
            this.birth = birth;
        }
    
        public Map getMaps() {
            return maps;
        }
    
        public void setMaps(Map maps) {
            this.maps = maps;
        }
    
        public List getLists() {
            return lists;
        }
    
        public void setLists(List lists) {
            this.lists = lists;
        }
    
        public Dog getDog() {
            return dog;
        }
    
        public void setDog(Dog dog) {
            this.dog = dog;
        }
    
        @Override
        public String toString() {
            return "Person{" +
                    "lastName='" + lastName + '\'' +
                    ", age=" + age +
                    ", boss=" + boss +
                    ", birth=" + birth +
                    ", maps=" + maps +
                    ", lists=" + lists +
                    ", dog=" + dog +
                    '}';
        }
    }
  2. @Value和@PropertySource方法
    SpringBoot配置文件_第2张图片

  3. @ConfigurationProperties方法
    SpringBoot配置文件_第3张图片

    <!‐‐导入配置文件处理器,配置文件进行绑定就会有提示‐‐>
    <dependency>        
        <groupId>org.springframework.bootgroupId>            
        <artifactId>spring‐boot‐configuration‐processorartifactId>            
        <optional>trueoptional>            
    dependency>
  4. 两种方式区别
    SpringBoot配置文件_第4张图片

    如果说,我们只是在某个业务逻辑中需要获取一下配置文件中的某项值,使用@Value;
    如果说,我们专门编写了一个javaBean来和配置文件进行映射,我们就直接使用@ConfigurationProperties;

  5. 配置文件注入值数据校验
    SpringBoot配置文件_第5张图片
    JSR提供的校验注解:
    @Null 被注释的元素必须为 null
    @NotNull 被注释的元素必须不为 null
    @AssertTrue 被注释的元素必须为 true
    @AssertFalse 被注释的元素必须为 false
    @Min(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
    @Max(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
    @DecimalMin(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
    @DecimalMax(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
    @Size(max=, min=) 被注释的元素的大小必须在指定的范围内
    @Digits (integer, fraction) 被注释的元素必须是一个数字,其值必须在可接受的范围内
    @Past 被注释的元素必须是一个过去的日期
    @Future 被注释的元素必须是一个将来的日期
    @Pattern(regex=,flag=) 被注释的元素必须符合指定的正则表达式

    Hibernate Validator提供的校验注解:
    @NotBlank(message =) 验证字符串非null,且长度必须大于0
    @Email 被注释的元素必须是电子邮箱地址
    @Length(min=,max=) 被注释的字符串的大小必须在指定的范围内
    @NotEmpty 被注释的字符串的必须非空
    @Range(min=,max=,message=) 被注释的元素必须在合适的范围内

  6. 创建、加载、导入配置文件
    a. 创建-配置文件的Java配置方式 @Configuration 和 @Bean
    @Configuration 作用于类上,相当于一个xml配置文件;
    @Bean 作用于方法上,相当于xml配置中的< bean >

    /**
     * @Configuration:指明当前类是一个配置类;就是来替代之前的Spring配置文件
     *
     * 在配置文件中用标签添加组件
     *
     */
    @Configuration
    public class MyAppConfig {
        //将方法的返回值添加到容器中;容器中这个组件默认的id就是方法名
        @Bean
        public HelloService helloService02(){
            System.out.println("配置类@Bean给容器中添加组件了...");
            return new HelloService();
        }
    }

    b.加载-加载指定的配置文件 @PropertySource:

    @PropertySource(value = {"classpath:person.properties"})
    @Component
    public class Person {
        private String lastName;
        private Integer age;
        private Boolean boss;
        private Date birth;
        private Map maps;
        private List lists;
        private Dog dog;

    c.导入-导入Spring的配置文件,让配置文件里面的内容生效 @ImportResource
    SpringBoot配置文件_第6张图片

  7. 配置文件占位符
    a. 随机数
    SpringBoot配置文件_第7张图片
    b. 占位符获取之前配置的值,如果没有可以是用:指定默认值
    这里写图片描述

三、Profile

  1. 什么是Profile文件?为什么要用到它?
       在做项目开发的时候,生产和测试的环境变化将决定其部分配置也可能不一致,如果每当环境发生变化就去手动修改配置,很繁琐且不必要,当后面配置又变回原来的配置时,又得去改很麻烦。Spring中为我们提供了Profile这个功能。我们只需要在启动的时候添加一个虚拟机参数,激活自己环境所要用的Profile就可以了。
       我们在主配置文件编写的时候,文件名可以是 application-{profile}.properties/yml
         默认使用application.properties的配置;
  2. 激活指定profile
    a、在配置文件中指定 spring.profiles.active={profile}
    b、命令行:

    java -jar spring-boot-02-config-0.0.1-SNAPSHOT.jar --spring.profiles.active={profile};

    可以直接在测试的时候,配置传入命令行参数
    c、虚拟机参数;
    -Dspring.profiles.active={profile}


四、外部配置加载顺序

SpringBoot也可以从以下位置加载配置; 优先级从高到低;高优先级的配置覆盖低优先级的配置,所有的配置会形成互补配置.

1.命令行参数
所有的配置都可以在命令行上进行指定
java -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar  --server.port=8087  --server.context-path=/abc
多个配置用空格分开; --配置项=值 

2.来自java:comp/env的JNDI属性

3.Java系统属性(System.getProperties()) 

4.操作系统环境变量 

5.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指定的默认属性

你可能感兴趣的:(spring)