说好每周坚持更新一篇博客,还是没能坚持下去,看来要好好反省下自己啦!不说太多废话,工作中自己踩过的一些坑一定要把它记录在博客让更多人知道,让更多人更加专注于业务代码的实现,没必要因为一些坑而耗费太多的时间!
今天讲的坑就是在SpringBoot中使用@Value给静态变量注入值失效的问题,相信不少小伙伴在工作中也会踩到这样的坑。那么这坑具体是怎么样的呢,看我下面详细的分析。
首先先看下面两张图片:
在前几周开发时我写了个redis工具类,然后想通过使用如上所示的方式来给redis的相关键值对设置过期时间,本来以为可以设置成功的,但看到日志打印那里过期时间居然显示为0,而不是我在application.properties中设置的过期时间,这就导致了我在redis中插入的键值对马上过期了,从而获取不到具体的值!
经过调试我发现RISK_CPT_RULE_FILE_EXPIREDTIME这个变量值是为0的,这说明这个变量直接读取了int的初始默认值。原因既然都找到了,那么如何解决呢?
既然不能正常地读取使用@Value中的值,那可以换种思路选择以方法注入的形式解决。具体步骤如下:
- 首先在RedisUtil这个类上方添加@Component注释,然后再声明一个staticRiskCptRuleFileExpiredtime静态变量;
- 然后定义一个setRiskCptRuleFileExpiredtime方法,在方法上方添加@Value("${risk.cpt.rule.file.expiredtime}"),意思就是读取这个配置然后将这个配置的值赋值给这个方法形参riskCptRuleFileExpiredtime,最后方法形参riskCptRuleFileExpiredtime会再赋值给staticRiskCptRuleFileExpiredtime这个静态变量,从而在下面的方法中直接读取staticRiskCptRuleFileExpiredtime这个变量。
为了让大家更方便理解,我将相关截图贴到了下面:
其实这个问题跟我之前写的解决使用@Autowired导入静态对象的实例时出现为null的情况的博客中的问题挺类似的,有兴趣的同学可以看看。具体链接我贴了出来。解决使用@Autowired导入静态对象的实例时出现为null的情况
从这周开始,以后我都会至少更新一篇博客,无论什么类型的都好,不过我会尽量以技术为主,欢迎大家监督!