@ConfigurationProperties的使用及与@Value的区别

深藏阁楼爱情的钟 2023-05-28 06:43 88阅读 0赞

@ConfigurationProperties

其主要作用是将配置文件中特定属性转换为Java对象,方便管理和使用。
其可以作为单独的Bean使用,也可以配合@Configuration使用(好像有点废话了)

@Configuration注解使用
SpringBoot 自定义starter组件
注:本文以将aliyun短信sdk中所需配置提升到Springboot配置文件中为例

与配置文件对应关系

application.yml配置文件

  1. spring:
  2. aliyun:
  3. domain: dysmsapi.aliyuncs.com
  4. regionid: cn-hangzhou
  5. accessKeyId: ********
  6. secret: ******************
  7. version: 2017-05-25

对应Class

  1. import org.springframework.boot.context.properties.ConfigurationProperties;
  2. @ConfigurationProperties(prefix = "spring.aliyun")
  3. public class AliyunProperties {
  4. private String domain;
  5. private String version;
  6. private String regionid;
  7. private String accessKeyId;
  8. private String secret;
  9. public String getDomain() {
  10. return domain;
  11. }
  12. public void setDomain(String domain) {
  13. this.domain = domain;
  14. }
  15. public String getVersion() {
  16. return version;
  17. }
  18. public void setVersion(String version) {
  19. this.version = version;
  20. }
  21. public String getRegionid() {
  22. return regionid;
  23. }
  24. public void setRegionid(String regionid) {
  25. this.regionid = regionid;
  26. }
  27. public String getAccessKeyId() {
  28. return accessKeyId;
  29. }
  30. public void setAccessKeyId(String accessKeyId) {
  31. this.accessKeyId = accessKeyId;
  32. }
  33. public String getSecret() {
  34. return secret;
  35. }
  36. public void setSecret(String secret) {
  37. this.secret = secret;
  38. }
  39. }

至此,当你的AliyunProperties.java在Spring的扫描路径(scanBasePackages)下时,配置文件到对象的配置就已经完成了(注意并不能直接使用)。

在SpringBoot项目中的使用

基于Spring的IOC的思想,此时AliyunProperties是不能被别的Bean所注入的,原因因为:

  1. @Target({ ElementType.TYPE, ElementType.METHOD })
  2. @Retention(RetentionPolicy.RUNTIME)
  3. @Documented
  4. public @interface ConfigurationProperties {
  5. @AliasFor("prefix")
  6. String value() default "";
  7. @AliasFor("value")
  8. String prefix() default "";
  9. boolean ignoreInvalidFields() default false;
  10. boolean ignoreUnknownFields() default true;
  11. }

其并未声明未Spring的组件,如果想像其他Bean那样直接交由IOC容器进行实例化,声明此类时加上@Component注解标注其为Bean组件即可:

  1. @ConfigurationProperties(prefix = "spring.aliyun")
  2. @Component //将其声明为Bean组件,注入到IOC容器中
  3. public class AliyunProperties {
  4. //... 代码在上面
  5. }

在@Configuration注解下使用实例:

  1. import com.aliyuncs.DefaultAcsClient;
  2. import com.aliyuncs.IAcsClient;
  3. import com.aliyuncs.profile.DefaultProfile;
  4. import org.springframework.context.annotation.Bean;
  5. import org.springframework.context.annotation.Configuration;
  6. import org.springframework.util.StringUtils;
  7. /** * 阿里云服务客户端 */
  8. @Configuration
  9. public class AcsClient {
  10. // 阿里云配置
  11. private static DefaultProfile profile = null;
  12. private static AcsSmsClient acsSmsClient = null;
  13. @Bean
  14. public IAcsClient client(AliyunProperties aliyunProperties){
  15. // 省略具体实现,不影响解读
  16. }
  17. }

作为普通Bean组件使用

  1. @RestController
  2. @RequestMapping("/sms")
  3. public class SmsController {
  4. @Autowired
  5. AliyunProperties aliyunProperties;
  6. }

通过以上两种使用方式,可以看到,在AliyunProperties这个Bean使用的时候属性已经是配置文件里的内容,也就是说AliyunProperties实例化后的属性是经过修改的(默认全为空),那么是什么时候修改的呢?这就需要了解@ConfigurationProperties的实现原理(关键点:Spring的Bean后处理器)。

其实在SpringBoot中还有个注解与@ConfigurationProperties比较相近@EnableConfigurationProperties, 这两者是配合使用的,@EnableConfigurationProperties注解是将指定的@ConfigurationProperties标注的类Bean化,这种实现方式AliyunProperties.java就不需要再@Component去声明了。

  1. import com.aliyuncs.DefaultAcsClient;
  2. import com.aliyuncs.IAcsClient;
  3. import com.aliyuncs.profile.DefaultProfile;
  4. import org.springframework.context.annotation.Bean;
  5. import org.springframework.boot.context.properties.EnableConfigurationProperties;
  6. import org.springframework.context.annotation.Configuration;
  7. import org.springframework.util.StringUtils;
  8. /** * 阿里云服务客户端 */
  9. @Configuration
  10. @EnableConfigurationProperties({ AliyunProperties.class})
  11. public class AcsClient {
  12. // 阿里云配置
  13. private static DefaultProfile profile = null;
  14. private static AcsSmsClient acsSmsClient = null;
  15. @Bean
  16. public IAcsClient client(AliyunProperties aliyunProperties){
  17. // 省略具体实现,不影响解读
  18. }
  19. }

@Value的使用

首先说明一点,@Value是spring-bean内提供的属性装配注解;
其使用方式有两种:
${ property : default_value } // 读取配置文件内属性(无需默认值的时候请连“:”一并省略,参见下面代码)
#{ obj.property? :default_value } // 读取对象属性(Bean)或者方法返回值(需要在前面增加@,如#{@obj.getValue()})

使用方式较为简单,在需要的Bean内直接使用注解即可

  1. import org.springframework.beans.factory.annotation.Value;
  2. @Service
  3. public class DemoServiceImpl implements DemoService {
  4. @Value("${base.server.serverurl}")
  5. public String serverurl;
  6. }

发表评论

表情:
评论列表 (有 0 条评论,88人围观)

还没有评论,来说两句吧...

相关阅读