Spring Boot读取配置属性常用方法解析
1.前言
在SpringBoot项目中我们经常需要读取application.yml配置文件的自定义配置,今天就来罗列一下从yaml读取配置文件的一些常用手段和方法。
2.@Value
首先,会想到使用@Value注解,该注解只能去解析yaml文件中的简单类型,并绑定到对象属性中去。
felord: phone:182******32 def: name:码农小胖哥 blog:felord.cn we-chat:MSW_623 dev: name:码农小胖哥 blog:felord.cn we-chat:MSW_623 type:JUEJIN
对于上面的yaml配置,如果我们使用@Value注解的话,冒号后面直接有值的key才能正确注入对应的值。例如felord.phone我们可以通过@Value获取,但是felord.def不行,因为felord.def后面没有直接的值,它还有下一级选项。另外@Value不支持yaml松散绑定语法,也就是说felord.def.weChat获取不到felord.def.we-chat的值。
@Value是通过使用Spring的SpEL表达式来获取对应的值的:
//获取yaml中felord.phone的值并提供默认值UNKNOWN
@Value("${felord.phone:UNKNOWN}")
privateStringphone;
@Value的使用场景是只需要获取配置文件中的某项值的情况下,如果我们需要将一个系列的值进行绑定注入就建议使用复杂对象的形式进行注入了。
3.@ConfigurationProperties
@ConfigurationProperties注解提供了我们将多个配置选项注入复杂对象的能力。它要求我们指定配置的共同前缀。比如我们要绑定felord.def下的所有配置项:
packagecn.felord.yaml.properties; importlombok.Data; importorg.springframework.boot.context.properties.ConfigurationProperties; importstaticcn.felord.yaml.properties.FelordDefProperties.PREFIX; /** *@authorfelord.cn */ @Data @ConfigurationProperties(PREFIX) publicclassFelordDefProperties{ staticfinalStringPREFIX="felord.def"; privateStringname; privateStringblog; privateStringweChat; }
我们注意到我们可以使用weChat接收we-chat的值,因为这种形式支持从驼峰camel-case到短横分隔命名kebab-case的自动转换。
如果我们使用@ConfigurationProperties的话建议配置类命名后缀为Properties,比如Redis的后缀就是RedisProperties,RabbitMQ的为RabbitProperties。
另外我们如果想进行嵌套的话可以借助于@NestedConfigurationProperty注解实现。也可以借助于内部类。这里用内部类实现将开头yaml中所有的属性进行注入:
packagecn.felord.yaml.properties; importlombok.Data; importorg.springframework.boot.context.properties.ConfigurationProperties; importstaticcn.felord.yaml.properties.FelordProperties.PREFIX; /** *内部类和枚举配置. * *@authorfelord.cn */ @Data @ConfigurationProperties(PREFIX) publicclassFelordProperties{ staticfinalStringPREFIX="felord"; privateDefdef; privateDevdev; privateTypetype; @Data publicstaticclassDef{ privateStringname; privateStringblog; privateStringweChat; } @Data publicstaticclassDev{ privateStringname; privateStringblog; privateStringweChat; } publicenumType{ JUEJIN, SF, OSC, CSDN } }
单独使用@ConfigurationProperties的话依然无法直接使用配置对象FelordDefProperties,因为它并没有被注册为SpringBean。我们可以通过两种方式来使得它生效。
3.1显式注入SpringIoC
你可以使用@Component、@Configuration等注解将FelordDefProperties注入SpringIoC使之生效。
packagecn.felord.yaml.properties; importlombok.Data; importorg.springframework.boot.context.properties.ConfigurationProperties; importorg.springframework.stereotype.Component; importstaticcn.felord.yaml.properties.FelordDefProperties.PREFIX; /** *显式注入SpringIoC *@authorfelord.cn */ @Data @Component @ConfigurationProperties(PREFIX) publicclassFelordDefProperties{ staticfinalStringPREFIX="felord.def"; privateStringname; privateStringblog; privateStringweChat; }
3.2@EnableConfigurationProperties
我们还可以使用注解@EnableConfigurationProperties进行注册,这样就不需要显式声明配置类为SpringBean了。
packagecn.felord.yaml.configuration; importcn.felord.yaml.properties.FelordDevProperties; importorg.springframework.boot.context.properties.EnableConfigurationProperties; importorg.springframework.context.annotation.Configuration; /** *使用{@linkEnableConfigurationProperties}注册{@linkFelordDevProperties}使之生效 *@authorfelord.cn */ @EnableConfigurationProperties({FelordDevProperties.class}) @Configuration publicclassFelordConfiguration{ }
该注解需要显式的注册对应的配置类。
3.3@ConfigurationPropertiesScan
在SpringBoot2.2.0.RELEASE中提供了一个扫描注解@ConfigurationPropertiesScan。它可以扫描特定包下所有的被@ConfigurationProperties标记的配置类,并将它们进行IoC注入。
packagecn.felord.yaml; importorg.springframework.boot.SpringApplication; importorg.springframework.boot.autoconfigure.SpringBootApplication; importorg.springframework.boot.context.properties.ConfigurationPropertiesScan; importorg.springframework.boot.context.properties.EnableConfigurationProperties; /** *{@linkConfigurationPropertiesScan}同{@linkEnableConfigurationProperties}二选一 * *@seecn.felord.yaml.configuration.FelordConfiguration *@authorfelord.cn */ @ConfigurationPropertiesScan @SpringBootApplication publicclassSpringBootYamlApplication{ publicstaticvoidmain(String[]args){ SpringApplication.run(SpringBootYamlApplication.class,args); } }
这非常适合自动注入和批量注入配置类的场景,但是有版本限制,必须在2.2.0及以上。
4.总结
日常开发中单个属性推荐使用@Value,如果同一组属性为多个则推荐@ConfigurationProperties。需要补充一点的是@ConfigurationProperties还支持使用JSR303进行属性校验。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。