• Spring 注入静态@Value值


    有时候我们的@Value获取yml值需要是静态的,但是静态的@Value获取一直是null,这时候有就可以用set或者@PostConstruct方式,但是这种方式有个bug,那就是如果其他类bean定义的时候用到该静态变量的话,使用的时候依然还没赋值,这时候就需要手动读取了。

    1. @Component
    2. public class MailInfo{
    3. @Value("${mail.name:admin@163.com}")
    4. public String preMailName;
    5. @Value("${mail.pwd:admin123}")
    6. public String preMailPwd;
    7. public static String mailName;
    8. public static String mailPwd;
    9. @PostConstruct
    10. public void init(){
    11. mailName = preMailName;
    12. mailPwd = preMailPwd;
    13. }
    14. }
    1. @Component
    2. public class MailInfo{
    3. public static String mailName;
    4. public static String mailPwd;
    5. @Value("${mail.name:admin@163.com}")
    6. public void setMailName(String name){
    7. mailName = name;
    8. }
    9. @Value("${mail.pwd:admin123}")
    10. public void setMailPwd(String pwd){
    11. mailPwd = pwd;
    12. }
    13. }

     如果出现下面情况的话上面两种方案就不生效了

    1. @Component
    2. public class Test{
    3. @Bean
    4. public Queue testQueue() {
    5. return new Queue(MqUtil.mName, true);
    6. //不论是这种还是@PostConstruct 方式,获取出来都是null
    7. }
    8. }
    9. @Component
    10. public class MqUtil{
    11. public static String mName;
    12. @Value("${test.name}")
    13. public void setMailName(String name){
    14. mName= name;
    15. }
    16. }

     解决

    用代码直接去读取,其他地方用到的时候就调用getName方法就行了

    1. @Component
    2. public class MqUtil {
    3. public static String name;
    4. public static String getName() {
    5. if (StringUtils.isEmpty(name)) {
    6. Yaml yaml = new Yaml();
    7. URL url = RabbitMqUtil.class.getClassLoader().getResource("config/application.yml");
    8. if (url != null) {
    9. try {
    10. Map map = (Map) yaml.load(new FileInputStream(url.getFile()));
    11. Map test= (Map) map.get("test");
    12. String name= (String) spring.get("name");
    13. } catch (FileNotFoundException e) {
    14. return "";
    15. }
    16. }else{
    17. return "";
    18. }
    19. }
    20. return name;
    21. }

  • 相关阅读:
    音视频从入门到精通——FFmpeg之av_seek_frame函数分析
    boost.regex正则表达式
    闲话Python编程-循环
    李宏毅-机器学习-笔记-P1
    无线安全操作(2)
    2022牛客暑期多校训练营6(ABGIJM)
    java过滤器(Filter)
    python系列教程214——列表解析与for和if
    热门免费api接口:含物流api,短信api,天气api等
    web概述08
  • 原文地址:https://blog.csdn.net/Damien_J_Scott/article/details/127783775