20、springboot类型安全的绑定(使用@ConfigurationProperties注解一次性拿到application.yml 配置文件中的多个属性值)

springboot类型安全的绑定

类型安全绑定就是把我们放在配置文件中的配置属性,批量的读到程序中来。
之前读取配置文件中的属性,使用的是 @Value 注解。
@Value 注解的局限:每次只能读取一个属性值。

★ @ConfigurationProperties注解

@ConfigurationProperties 这个可以一次读取很多属性,还能校验,所以这个就是类型安全绑定

@ConfigurationProperties注解可整体读取的多个属性或具有某种结构关系的一组属性,该注解有两个主要用法:修饰类和修饰方法

  • 修饰属性处理类: 当该注解修饰的类被部署为容器中的Bean时,
    @ConfigurationProperties注解指定的属性将会被注入该Bean的属性。
    因此将@ConfigurationProperties注解修饰的类被称为 “属性处理类”。

    ConfigurationProperties注解修饰的类,就是一个“属性处理类”。

  • 修饰@Bean修饰的方法: @Bean修饰的方法将会配置一个容器中的Bean,
    而@ConfigurationProperties注解指定的属性将会被注入该Bean的属性。

▲ 支持的属性:

  • prefix(或value):指定要加载带哪些前缀的属性。

  • ignoreInvalidFields():指定是否忽略无效字段值。
    比如处理类定义了某个字段的类型是Integer,但配置文件为该字段配置的值是abc,这就是无效的值。
    该属性值默认为false,也就是不忽略,这意味着配置文件中如果配置了无效值,将会导致异常。

  • ignoreUnknownFields():指定是否忽略未知(多余)的字段值。
    如果配置文件中配置的属性比处理类需要的属性更多,那多出来的属性就属于未知属性。
    该属性值默认为true,也就是自动忽略,这意味着配置文件中如果配置多余的属性值,将不会引起异常。

★ 属性处理类

属性处理类的要求非常简单,只要为需要注入的属性提供成员变量,并提供对应的getter和setter方法即可。

★ 启用@ConfigurationProperties

@ConfigurationProperties修饰的类不会自动起作用,必须通过如下方式启用该注解:

 - 为@ConfigurationProperties注解修饰的类添加@Component注解。

 - 将@ConfigurationProperties注解修饰的类显式配置成容器中的Bean。就是用@Bean注解修饰。(和前一种方式的本质相同)

 --------------前面两种方式的本质是一样的,都是将属性处理类变成容器中的Bean------------

- 使用@EnableConfigurationProperties注解,该注解可显式指定一个或多个属性处理类,
  Spring Boot将会启用这些属性处理类上的@ConfigurationProperties注解。

- 使用@ConfigurationPropertiesScan注解,该注解指定启用一个或多个包及其子包下
  所有带@ConfigurationProperties注解的类。

代码示例

applicaiton.yml

# 测试 @ConfigurationProperties 注解,用来一次性读取配置文件中
me:
  appli:
    aName: 《蜡笔小新》
    adesc: ${me.appli.aName} 非常好看
    user02:
      uName: 野原新之助
      uAge: 5
    book02:
      bName: 《蜡笔小新漫画》
      bPrice: 100
#      如果这个属性值没有在属性类中被读取到,会被自动忽略,不会引起异常
      baddress: 地址

属性处理类:
用@ConfigurationProperties修饰,用@Component 注解启动@ConfigurationProperties注解

* 这个类用@ConfigurationProperties注解修饰,可以叫属性处理类.
 * 通过 @ConfigurationProperties 注解,用来一次性读取application.yml配置文件中的多个属性值
 */
//prefix = "me.appli" 表示这个属性处理类只读取配置文件中开头为 me.appli 的属性
@RestController
@Data
@Component //启动@ConfigurationProperties注解
//这个注解修饰的类就是属性处理类,用来一次性读取application.yml配置文件中的多个属性值
@ConfigurationProperties(prefix = "me.appli")
public class ApplicationYmConfig {

    //测试 @ConfigurationProperties 注解,用来一次性读取application.yml配置文件中的多个属性值
    private String aName;
    private String adesc;
    private User02 user02;
    private Book02 book02;

    //创建一个User02内部类
    @Data
    public static class User02{
        private String uName;
        private int age;
    }
    //创建一个Book02内部类
    @Data
    public static class Book02{
        private String bName;
        private int bPrice;
    }
}

测试:

 * 这个类用来测试ApplicationYmConfig属性类中,使用@ConfigurationProperties注解,
 * 看能否一次性拿到application.yml 配置文件中的多个属性值
@RestController
public class ApplicationYmConfigTestController {

    //直接访问容器中的属性处理类的实例即可
    private ApplicationYmConfig applicationYmConfig;

    public ApplicationYmConfigTestController(ApplicationYmConfig applicationYmConfig) {
        this.applicationYmConfig = applicationYmConfig;
    }

    //直接返回对象,查看是否拿到属性值
    @GetMapping("/testApplicationYmConfig")
    public ApplicationYmConfig testApplicationYmConfig(){
        return applicationYmConfig;
    }
}

结果:
在这里插入图片描述

注释:
用@ConfigurationProperties 注解,只需要在类上面添加注解就可以一次性拿到yml配置文件中的多个属性值,不需要跟之前用@Value这个注解来一个一个拿。

@Value一个一个拿的方式

20、springboot类型安全的绑定(使用@ConfigurationProperties注解一次性拿到application.yml 配置文件中的多个属性值)_第1张图片

你可能感兴趣的:(springboot,spring,boot,java,spring)