SpringBoot使用@Value从yml文件取值为空--注入静态变量

本文详细解析了在SpringBoot项目中,如何正确使用@Value注解从yml配置文件中读取属性值,并解决了静态变量注入的问题。通过实例展示了将@Value注解应用于非静态方法上,避免因static特性导致的注入失败。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SpringBoot使用@Value从yml文件取值为空--注入静态变量

1.application.yml中配置内容如下:

  1.  
    pcacmgr:
  2.  
    publicCertFilePath: E:\\pcacmgr\\CerFiles\\xh_public.cer
  3.  
    encPublicCertFilePath: E:\\pcacmgr\\CerFiles\\hjzf_encPublic.cer
  4.  
    encPfxFilePath: E:\\pcacmgr\\CerFiles\\hjzf_encPfx.pfx
  5.  
    encPfxFilePwd: 11111111

2.通过@Value获取值:

  1.  
    @Configuration
  2.  
    public class PcacIntegrationUtil {
  3.  
    @Value("${pcacmgr.publicCertFilePath}")
  4.  
    private static String publicCertFilePath;
  5.  
     
  6.  
    @Value("${pcacmgr.encPfxFilePath}")
  7.  
    private static String encPfxFilePath;
  8.  
     
  9.  
    @Value("${pcacmgr.encPfxFilePwd}")
  10.  
    private static String encPfxFilePwd;
  11.  
     
  12.  
    @Value("${pcacmgr.encPublicCertFilePath}")
  13.  
    private static String encPublicCertFilePath;
  14.  
     
  15.  
    public static String signData(String sourceData) {
  16.  
    System.out.println(publicCertFilePath);
  17.  
    }
  18.  
    }

3.启动项目调用过程中发现获取值为null。

4.发现是static导致,以下为解决方案:

  1.  
    @Configuration
  2.  
    public class PcacIntegrationUtil {
  3.  
    private static Logger logger = LoggerFactory.getLogger(PcacIntegrationUtil.class);
  4.  
     
  5.  
    private static String publicCertFilePath;
  6.  
    public static String getPublicCertFilePath() {
  7.  
    return publicCertFilePath;
  8.  
    }
  9.  
    @Value("${pcacmgr.publicCertFilePath}")
  10.  
    public void setPublicCertFilePath(String publicCertFilePath) {
  11.  
    PcacIntegrationUtil.publicCertFilePath = publicCertFilePath;
  12.  
    }
  13.  
     
  14.  
    public static String signData(String sourceData) {
  15.  
    System.out.println(publicCertFilePath);
  16.  
    }
  17.  
    }

问题解决,打印结果与yml文件配置的内容相符。

 

心得:使用注解的方式,不过注解写在非static的方法上(Spring的注解不支持静态的变量和方法)。

### Spring Boot中@Value注解的用法及取值示例 在Spring Boot中,`@Value`注解用于从配置文件(如`application.properties`或`application.yml`)中读取属性值,并将其注入到类的字段中。它支持两种表达式来加载属性值:一种是占位符(PlaceHolder)方式,格式为`${...}`;另一种是Spring表达式语言(SpEL),格式为`#{...}`[^1]。 以下是一个完整的示例,展示如何使用`@Value`注解获取配置值: #### 示例代码 假设`application.properties`文件中有如下配置: ```properties app.name=MyApplication app.description=A Spring Boot Application ``` ##### 使用PlaceHolder方式 通过`${...}`语法读取配置文件中的值。 ```java package com.example.demo; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class AppConfigController { @Value("${app.name}") private String appName; @Value("${app.description}") private String appDescription; @GetMapping("/app-info") public String getAppInfo() { return "Application Name: " + appName + ", Description: " + appDescription; } } ``` ##### 使用SpEL表达式 通过`#{...}`语法进行更复杂的计算或引用其他Bean属性。 ```java package com.example.demo; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; @Component public class SpelExample { @Value("#{T(java.lang.Math).random() * 100}") private double randomValue; public double getRandomValue() { return randomValue; } } ``` #### 注意事项 如果在测试环境中遇到`@Value`注解获取值为`null`的问题,可能是因为静态字段无法正确注入值。例如,在下面的代码中,`secret`是一个静态字段,因此`@Value`注解无法正常工作[^2]。 错误示例: ```java @Component public class ValueTest { @Value("${jwt.secret}") private static String secret; // 静态字段无法注入 public static String getSecret() { return secret; } } ``` 解决方法是避免将需要注入的字段声明为`static`,或者通过构造函数等方式手动设置值。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值