tags: [springboot]
categories: [基本使用]


写在前面

之前做SpringBoot项目时,所有的属性注入都是通过YML里面配置文件来配合@Value注解来注入的,这次开发时,试着注入数组发现@Value注解不支持,借着这个机会,重新研究了SrpingBoot属性注入的几种方法,以及适合的各种各样的场景

属性注入

@Value注解注入

基本使用

这是最常见的用法,我们在配置文件中自定义标签aaa.bbb,值为简单数据类型,然后在需要使用该属性的地方加上@Value注解,注解Value属性值为${"aaa.bbb"}直接使用@Value注解下的定义的字段,如

  1. ############### 属性注入 ##############################
  2. email:
  3. sender: 'bwensun@foxmail.com'
  4. # 邮件thymeleaf模板路径
  5. template:
  6. captcha: mail/captcha
  1. @Component
  2. @Slf4j
  3. public class EmailService {
  4. @Value("${email.sender}")
  5. String emailSender;
  6. @Value("${email.template.captcha}")
  7. String captchaTemplate;
  8. }

value注解可以通过冒号设置默认值

  1. @Value("${server.port:8080}") //没有设置则默认设为8080
  2. private String port;

也可以注入数组和List,注意默认以都好分割,在YML中的数组和List

  1. tools=car,train,airplane
  1. /**
  2. * 注入数组(自动根据","分割)
  3. */
  4. @Value("${tools}")
  5. private String[] toolArray;
  6. /**
  7. * 注入列表形式(自动根据","分割)
  8. */
  9. @Value("${tools}")
  10. private List<String> toolList;

注入非配置文件中的属性(事实上都是spring已知的信息),可以接口SPEL表达式使用

  1. /**
  2. * 注入普通字符串,相当于直接给属性默认值
  3. */
  4. @Value("程序新视界")
  5. private String wechatSubscription;
  6. /**
  7. * 注入操作系统属性
  8. */
  9. @Value("#{systemProperties['os.name']}")
  10. private String systemPropertiesName;
  11. /**
  12. * 注入表达式结果
  13. */
  14. @Value("#{ T(java.lang.Math).random() * 100.0 }")
  15. private double randomNumber;
  16. /**
  17. * 注入其他Bean属性:注入config对象的属性tool
  18. */
  19. @Value("#{config.tool}")
  20. private String tool;
  21. /**
  22. * 注入列表形式(自动根据"|"分割)
  23. */
  24. @Value("#{'${words}'.split('\\|')}")
  25. private List<String> numList;
  26. /**
  27. * 注入文件资源
  28. */
  29. @Value("classpath:config.xml")
  30. private Resource resourceFile;
  31. /**
  32. * 注入URL资源
  33. */
  34. @Value("http://www.choupangxia.com")
  35. private URL homePage;

@ConfigurationProperties注解

相比于@``Value注解,@ConfigurationProperties需要做的使用更多,我们需要新建一个结构和注入属性接口一致的类,配置@ConfigurationProperties@Configuration注解来,就把他当作一个一般的bean,通过注入的方式来获取该对象的值

  1. # zoombar
  2. zoombar:
  3. whitelist:
  4. - 'login'
  5. jwtSecretKey: 'zoombar.fun'
  6. token:
  7. expiredTime: 365
  1. @Configuration
  2. @ConfigurationProperties(prefix = "zoombar")
  3. @Getter
  4. @Slf4j
  5. @Setter
  6. public class ZoombarProperties {
  7. /**
  8. * 白名单
  9. */
  10. public List<String> whitelist;
  11. /**
  12. * jwt密钥
  13. */
  14. private String jwtSecretKey;
  15. @PostConstruct
  16. public void init(){
  17. log.info("ZoombarProperties 属性注入成功");
  18. }
  19. }


关于@PropertySource注解

参考

SpringBoot属性注入的各种姿势(含2.2.0版本最新方式)

SpringBoot之Spring@Value属性注入使用详解