遇到的现象
在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的相关知识。所以温故而知新
有的时候真的应该停下来将之前的知识复习一遍。