文章目录
- @ EnableConfigurationProperties 简绍
- 使用 @ConfigurationProperties
- 源码解析
- 注解元注解
- 注解属性
- 列表项配置文件读取:
- 属性绑定:
- 错误处理:
- 注意事项
@ EnableConfigurationProperties 简绍
@EnableConfigurationProperties 是一个 Spring Boot 提供的注解,用于启用特定的 @ConfigurationProperties 类。这个注解通常用在 Spring 的配置类上,以显式地声明哪些 @ConfigurationProperties 类应该被 Spring 容器管理。
使用 @ConfigurationProperties
创建配置类: 创建一个 Java 类来保存配置属性。 同时需要施加 @Component 确保 能检测到识别bean
通过使用@Component注解,我们可以方便地进行组件的管理和依赖注入,具体后续再说 使用 @Autowired 去进行注入,
如果是在配置类中使用 @EnableConfigurationProperties,则需要在配置类上添加该注解,并指定要启用的配置类。
@Component
@Data
@ConfigurationProperties(prefix = "test")
public class Test {private String test1;private String test2;
}
1
对应 Controller 去调用,使用
@RequestMapping("/test")
public class TestController {@AutowiredTest test;@GetMapping("/test")public void test(){System.out.println(test.getTest1());System.out.println(test.getTest2());}
}
在配置文件中的定义, ConfigurationProperties通过识别 ConfigurationProperties 的 prefix 前缀来对应配置文件中配置的信息
test:test1: 张三test2: 李四
源码解析
注解元注解
- @Target:指定了此注解可以应用的有效目标类型。
{ElementType.TYPE, ElementType.METHOD} 表示它可以应用于类和方法。 - @Retention:指定了注解的保留策略。
RetentionPolicy.RUNTIME 表示该注解将在运行时存在,并且可以通过反射读取。 - @Documented:表示该注解应该包含在 API 文档中。
- @Indexed:这个注解表明被标注的元素将被 Spring 框架索引。它通常与 @Component 和类似的注解一起使用
注解属性
- value() 和 prefix():这两个属性是互为别名的,用于指定配置文件中属性的前缀。默认情况下,如果没有指定前缀,则默认为空字符串。
- ignoreInvalidFields():此属性指定是否忽略无效字段。如果设置为 true,那么即使某些字段无法映射到类的属性上,也不会抛出异常。默认值为 false。
- ignoreUnknownFields():此属性指定是否忽略未知字段。如果设置为 true,那么即使配置文件中存在未在类中定义的属性,也不会抛出异常。默认值为 true
列表项配置文件读取:
Spring Boot 使用 PropertySourceLocator 接口来定位和加载配置源。
通常情况下,Spring Boot 会自动检测 application.properties 或 application.yml 文件,并将它们加载到 Environment 中。
属性绑定:
- 当一个类被标记了 @ConfigurationProperties 注解后,Spring Boot 会使用 ConfigurationPropertiesBinder 来 将配置文件中的属性绑定到该类的字段上。
- ConfigurationPropertiesBinder 依赖于 ConversionService 和 PropertyEditorRegistry 来转换类型。
- 如果配置文件中的属性名称与类的字段名称匹配,它们将被自动绑定。
错误处理:
如果配置文件中的属性无法正确绑定到类的字段上,可能会抛出 BindException 或 IllegalStateException。
配置启用:
为了使 @ConfigurationProperties 生效,还需要使用 @EnableConfigurationProperties 或将配置类标记为 @Component。
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Indexed
public @interface ConfigurationProperties {@AliasFor("prefix")String value() default "";@AliasFor("value")String prefix() default "";boolean ignoreInvalidFields() default false;boolean ignoreUnknownFields() default true;
}
注意事项
- 自动配置:
如果你使用的是 Spring Boot,通常情况下你不需要显式地使用 @EnableConfigurationProperties,因为 Spring Boot 自动配置会处理 @ConfigurationProperties 类的注册。但是,如果你需要显式地控制注册过程或者你的应用不是基于 Spring Boot 构建的,那么使用 @EnableConfigurationProperties 是必要的。 - 可选性:
当你的 @ConfigurationProperties 类是在 Spring Boot 应用的默认扫描路径内时,你可能不需要使用 @EnableConfigurationProperties,因为 Spring Boot 会自动发现这些类。 - 多配置类:
如果你有多个 @ConfigurationProperties 类,可以在 @EnableConfigurationProperties 注解中使用 {} 来指定多个类。 - 配置前缀:
确保 @ConfigurationProperties 的 prefix 属性与你的配置文件中的键名匹配。