栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Springboot中@Value注解未注入值

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Springboot中@Value注解未注入值

遇到的现象

在bootstrap.yml中配置了七牛云的相关值,但在代码中通过@Value注解未注入该值。debug调试发现该值未NULL

@Value("${qiniu.secreteKey}")
public static String secreteKey; 
问题原因

问题原因其实很基础,就是@Value注解的生效条件。我是因为使用的是静态变量。
@Value注解生效的条件时,该字段不能为静态的,不能是常量,并且该类必须注册为Bean对象(加@Component注解)。在使用时必须注入该对象,而不能使用new的方式创建对象。

解决方案

第一种方案最简单,将static去掉即可。

@Value("${qiniu.secreteKey}")
public String secreteKey; 

但有的时候我们就希望该字段是静态的该怎么办呢?
第二个方法,先思考为什么不能使用@Value注入静态变量的值呢?因为静态变量不是对象属性而是类属性。而Spring依赖注入是对象层面的,所以他无法帮我们注入类属性。
既然已经明了问题的根本原因,那接下来就很容易了,我们知道@Value的作用对象不仅可以用于字段,也可以用于方法,用于形参等。

@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Value {
	String value();
}

所以我们可以在一个对象方法上加入@Value注解,让他来设置我们的静态变量。

@Component
public class Tools {
	public static String secreteKey; 
	
	@Value("${qiniu.secreteKey}")
	public void setSecreteKey(String key){
		Tools.secreteKey = key
	}
}
总结

@Value是一个很基础的注解,但平时使用@Value更多的是在对象属性上,慢慢忘记了@Value的相关知识。所以温故而知新有的时候真的应该停下来将之前的知识复习一遍。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/995662.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号