SpringBoot⾃定义配置时@Value和@ConfigurationProperti。。。
⼀、@Value
通过@Value我们可以直接将属性值注⼊到IOC容器的相应bean 中,业务上我们注⼊单个属性时最常使⽤的也是这种⽅式。
不过,有时使⽤@Value("${property}")注解来注⼊配置属性有时会很⿇烦,尤其是当要使⽤多个属性 或 数据本质上是分层的 时。
所以,Spring Boot 提供了⼀种使⽤属性的替代⽅法,可以让强类型 bean 管理和验证应⽤程序的配置。
spring ioc注解使⽤⽅式:
需要使⽤到属性的JavaBean中:
@Value("${st}")
private String test;
yaml⽂件:
test:
test: test-resources/
⼆、@ConfigurationProperties
@ConfigurationProperties加载配置是通过BeanPostProcessor实现,其对应的Bean的后置处理器
为ConfigurationPropertiesBindingPostProcessor。也就是说在bean被实例化后,会调⽤后置处理器,递归的查属性,通过反射机制注⼊值,因此属性需要提供setter和getter⽅法。
此外,针对此种属性注⼊的⽅式,SpringBoot⽀持Relaxed Binding,即只需保证配置⽂件的属性和setter⽅法名相同即可。
在SpringBoot官⽅⽂档中有⼏个注意点:
属性必须要有getter、setter⽅法;
如果属性的类型是集合,要确保集合是不可变的;
如果使⽤Lombok⾃动⽣成getter/setter⽅法,⼀定不要⽣成对应的任何构造函数,因为Spring IOC容
器会⾃动使⽤它来实例化对象。
使⽤JavaBean属性绑定的⽅式只针对标准 Java Bean 属性,不⽀持对静态属性的绑定。
当我们使⽤@ConfigurationProperties注解进⾏属性注⼊时,记得在l⽂件中添加spring-boot-configuration-processor依赖,
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
否则相应类上会有⼀⾏红⾊的异常信息,具体如下:
Spring Boot Configuration Annotation Processor not found in classpath
并且在pom中加上spring-boot-configuration-processor依赖之后,我们使⽤@ConfigurationProperties注解注释的配置类中的字段,在yaml⽂件中会⾃动带出提⽰ / 补全。
1、@EnableConfigurationProperties
Spring考虑到带有注释@ConfigurationProperties的类可能不适合扫描(⽐如:我正在开发⾃⼰的⾃动配置或希望有条件地启⽤它们),所以Spring并不会⾃动扫描带有注释@ConfigurationProperties的类。
在这些情况下,推荐使⽤@EnableConfigurationProperties注解指定要处理的类型列表(即:将@ConfigurationProperties注释的类加到Spring IOC容器中)。⼀般通过将@EnableConfigurationProperties加在@Configuration类上完成。
使⽤⽅式1:@EnableConfigurationProperties + @Configuration + @ConfigurationProperties
如下例所⽰:
@Configuration(proxyBeanMethods =false)
@EnableConfigurationProperties(SomeProperties.class)
public class MyConfiguration {
}
@ConfigurationProperties(prefix ="some.properties")
public class SomeProperties {
private String test;
}
这种⽅式在Spring源码中被⼴泛使⽤:
⽐如:Spring MVC的配置类(WebMvcProperties)
其在WebMvcAutoConfiguration类的静态内部类WebMvcAutoConfigurationAdapter上被通过@Configuration +
@EnableConfigurationProperties的⽅式被注⼊到Spring IOC容器中。
使⽤⽅式2:@Configuration + @ConfigurationProperties
直接将@Configuration注解 和 @ConfigurationProperties注解加在JavaBean上,让Spring IOC可以⾃动扫描到 @ConfigurationProperties注解标注的类。
@Configuration(proxyBeanMethods =false)
@ConfigurationProperties(prefix ="some.properties")
public class SomeProperties {
private String test;
}
2、宽松绑定(Relaxed Binding)
Spring Boot 中使⽤⼀些宽松的规则将环境属性(可以理解为配置⽂件l中的属性)绑定到bean中,也就是说:yaml⽂件中的属性名称和 JavaBean属性名称@ConfigurationProperties之间不需要完全匹配。包括:
破折号分隔的环境属性(context-path绑定到contextPath)
⼤写环境属性(PORT绑定到port)
例如,考虑以下@ConfigurationProperties类:
@ConfigurationProperties(prefix ="my.main-project.person")
public class MyPersonProperties {
private String firstName;
public String getFirstName(){
return this.firstName;
}
public void setFirstName(String firstName){
this.firstName = firstName;
}
}
使⽤上述代码时,可以使⽤以下属性名称:
Property Note
my.main-project.person.first-name Kebab case,通常使⽤在 .properties 和 .yml ⽂件中
my.main-project.person.firstName标准驼峰⽅式
my.main-project.person.first_name下划线表⽰法,在.properties 和 .yml⽂件中使⽤的另⼀种格式MY_MAINPROJECT_PERSON_FIRSTNAME⼤写格式,在使⽤系统环境变量时推荐使⽤
注意:@ConfigurationProperties注解中prefix的值必须是 kebab ⼤⼩写(⼩写并⽤ 分隔-,例如my.main-project.person)
每种属性源的宽松绑定规则
3、JSR-303对@ConfigurationProperties验证
每当使⽤ Spring 的注解@Validated进⾏注解时,Spring Boot 都会尝试验证类。我们可以直接在配置类上使⽤ JSR-303约束注释。
@ConfigurationProperties("my.service")
@Validated
public class MyProperties {
@NotNull
private InetAddress remoteAddress;
//
}
注:注释@Bean创建配置属性的⽅法来也可以触发验证@Validated
4、第三⽅配置
@ConfigurationProperties除了⽤于注释类之外,还可以在公共@Bean⽅法上使⽤它。当想要将属性绑定到我们⽆法控制的第三⽅组件时,这样做会特别有⽤。
@Configuration(proxyBeanMethods =false)
public class ThirdPartyConfiguration {
@Bean
@ConfigurationProperties(prefix ="another")
public AnotherComponent anotherComponent(){
return new AnotherComponent();
}
}
三、@Value和@ConfigurationProperties的区别?
@ConfigurationProperties注解⽀持属性⽂件和javabean的映射;⽽@Value⽀持spel表达式。
@ConfigurationProperties注解⽀持全量的属性 宽松绑定⽅式;⽽@Value只推荐使⽤标准的kebab-case⽅式(仅使⽤⼩写字母和-),例如:@Value("{demo.item-price}")可以提取demo.item-price和demo.itemPrice。
对于多个属性映射,并且属性常常被复⽤时,推荐使⽤@ConfigurationProperties;只读取单个属性使⽤@Value更简单⽅便。四、SpringBoot配置加载优先级
移步⾄:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论