目录
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修饰的类不会自动起作用,必须通过如下方式启用该注解:
方式1:
为@ConfigurationProperties注解修饰的类添加@Component注解。
方式2:
将@ConfigurationProperties注解修饰的类显式配置成容器中的Bean。就是用@Bean注解修饰。(和前一种方式的本质相同)
前面两种方式的本质是一样的,都是将属性处理类变成容器中的Bean
方式3:
使用@EnableConfigurationProperties注解,该注解可显式指定一个或多个属性处理类,Spring Boot将会启用这些属性处理类上的@ConfigurationProperties注解。
方式4:
使用@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这个注解来一个一个拿。