SpringBoot-3-配置文件

SpringBoot --> 三、配置文件

ref. 狂神说

3. SpringBoot配置文件

3.1 配置文件

**配置文件的作用 :**修改SpringBoot自动配置的默认值,因为SpringBoot在底层都自动配置了。

SpringBoot使用一个全局的配置文件 , 配置文件名称是固定的:

  • application.properties 语法结构 :key=value
  • application.yml 语法结构 :key:空格 value

比如可以在配置文件中修改Tomcat 默认启动的端口号:

server.port=8555

3.2 yaml

3.2.1 概述
  • YAML,“YAML Ain’t a Markup Language” (YAML不是一种标记语言)。在开发的这种语言时,YAML 的意思其实是:“Yet Another Markup Language”(仍是一种标记语言);

  • 数据作为中心,而不是以标记语言为重点;

  • 以前的配置文件,大多数都是使用xml来配置;比如一个简单的端口配置,对比下yaml和xml:

    传统xml配置:

    <server>
        <port>8555<port>
    </server>
    

    yaml配置:

    server:
      prot: 8555
    
3.2.2 yaml基础语法

语法要求严格!

  • 空格不能省略;
  • 以缩进来控制层级关系,只要是左边对齐的一列数据都是同一个层级的;
  • 属性和值的大小写敏感。

字面量:普通的值(数字,布尔值,字符串)

  • 字面量直接写在后面就可以 , 字符串默认不用加上双引号或者单引号;
k: v
  • “ ” 双引号,不会转义字符串里面的特殊字符,特殊字符会作为本身想表示的意思;比如 :name: “key \n NG” 输出:key 换行 NG
  • ‘’ 单引号,会转义特殊字符,特殊字符最终会变成和普通字符一样输出。比如 :name: ‘key \n NG’ 输出 :key \n NG

对象、Map(键值对)

#对象、Map格式
k: 
    v1:
    v2:
  • 在下一行写对象的属性和值的关系,注意缩进;比如:

    rapper:
        name: keyNG
        age: 19
    
  • 行内写法:

    rapper: {keyNG: qinjiang,age: 19}
    

数组( List、set )

  • 用 - 值表示数组中的一个元素,比如:

    pets:
     - cat
     - dog
     - pig
    
  • 行内写法

    pets: [cat,dog,pig]
    

3.3 yaml配置文件注入

  • yaml文件更强大的地方在于,可以给实体类直接注入匹配值!

一个简单的测试:

  1. 编写实体类PersonDog,使用了lombok插件;

    Person.java

    package com.ano.hello.pojo;
    
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.stereotype.Component;
    
    import java.util.Date;
    import java.util.List;
    import java.util.Map;
    
    @Component //注入bean到容器中
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public class Person {
        private String name;
        private Integer age;
        private Date birth;
        private Dog dog;
        private List<Object> hobbies;
        private Map<String, Object> scores;
    }
    

    Dog.java

    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public class Dog {
        private String name;
        private Integer age;
    }
    
  2. 使用yaml配置的方式注入Person类,新建并编写配置文件resources/application.yml,注意语法;

    person:
      name: KeyNG
      age: 19
      birth: 2003/7/28
      dog:
        name: 大头
        age: 3
      hobbies:
        - rap
        - fitness
      scores: {TOEFL: 112, MATH: 66}
    
  3. 使用注解@ConfigurationProperties将配置文件中对象的值注入到Person类中;

    @ConfigurationProperties作用:

    ​ 将配置文件中配置的每一个属性的值,映射到这个组件中;

    ​ 告诉SpringBoot将本类中的所有属性和配置文件中相关配置进行绑定;

    ​ 参数prefix = “xxx” : 将配置文件中的person下面的所有属性一一对应。

    @Component
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    @ConfigurationProperties(prefix = "person")
    public class Person {
        private String name;
        private Integer age;
        private Date birth;
        private Dog dog;
        private List<Object> hobbies;
        private Map<String, Object> scores;
    }
    

    这是会发现springboot有一个报错提示:

    在这里插入图片描述

  4. pom.xml导入配置文件处理器依赖,解决上述报错提示

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-configuration-processor</artifactId>
        <optional>true</optional>
    </dependency>
    

    导入后,可以看到配置文件会有提示;

  5. 在测试类中编写一个测试:

    @SpringBootTest
    class Springboot01HelloApplicationTests {
    
        @Autowired
        Person person;
        
        @Test
        void testPerson(){
            System.out.println(person);
        }
    }
    

    运行,可以看到所有值注入成功:

    在这里插入图片描述

3.4 加载指定配置文件

  • @ConfigurationProperties(prefix = “xxx”)
    • 默认是从全局配置获取;
    • 配置文件名只能是application.yml
    • 优点是只需要配置参数prefix = “xxx”就会自定匹配相对应的属性。
  • @PropertySource(value=“xxx”)
    • 加载指定的配置文件;
    • 缺点是:每个属性需要通过@Value(“${xxx}”)手动注入值。

一个简单测试

  1. 新建并编写一个配置文件resources/person.properties

    name= Ano ${random.uuid}
    age= ${random.int}
    

    使用了${random.uuid}${random.int}生成随机值;

  2. 在实体类上使用@PropertySource加载指定配置文件并注入属性值;

    @Component
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    @PropertySource(value = "classpath:person.properties")
    public class Person {
        @Value("${name}")
        private String name;
        @Value("${age}")
        private Integer age;
        ...
    }
    
  3. 测试程序不变,运行测试:指定配置文件绑定并注入值成功。

    在这里插入图片描述

3.5 properties和yaml配置文件对比

@ConfigurationProperties@Value
功能写在实体类上方,批量注入配置文件中的属性值写在属性上方,一个一个注入属性值
松散绑定支持不支持
SpEL不支持支持
JSR303数据校验支持不支持
复杂类型封装支持不支持
  • @ConfigurationProperties只需要写一次即可,@Value则需要每个字段都添加;
  • 松散绑定: 比如yml中写last-name,和lastName是一样的;
  • SpEL:是Spring 表达式语言(简称“SpEL”)是一种强大的表达式语言,支持在运行时查询和操作对象图;
  • JSR303数据校验:可以在字段是增加一层过滤器验证,可以保证数据的合法性;
  • 复杂类型封装:使用@ConfigurationProperties在yml中就可以封装对象,使用@Value不行;

结论

  1. 推荐使用yaml配置文件;

  2. 如果在某个业务中,只需要获取配置文件中的某个值,可以使用一下 @Value;

  3. 如果说,专门编写了一个JavaBean来和配置文件进行一一映射,就直接@ConfigurationProperties。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值