1 知识储备
在搞清楚这个现象之前,我们需要知道一定的Spring知识,请先去理解一下,以便能更好的领悟。
2 异常现象
2.1 起因
@Component
@Slf4j
public class OssUtils {
@Value("${oss.endpoint}")
private static String END_POINT;
private static void createOSSClient(){
String endpoint = END_POINT;
log.info("endpoint的值为:{}",endpoint)
}
}
2.2 分析
期望是:
当程序运行起来时候,通过注入,将值注入到END_POINT中,这样我们就可以在静态方法的createOSSClient中进行使用了。
实际结果为:endpoint的值为:null
出现这样的原因,最直观明白是END_POINT没有被注入。
那么为什么没有被注入呢。
静态态变量/类变量不是对象的属性,而是一个类的属性,spring则是基于对象层面上的依赖注入
- 而使用静态变量/类变量扩大了静态方法的使用范围.静态方法在spring是不推荐使用的。
- 依赖注入的主要目的,是让容器去产生
一个对象的实例
,然后在整个生命周期中使用他们。一旦你使用静态方法,就不再需要去产生这个类的实例
,同时你也不能为一个给定的类,依靠注入方式去产生多个具有不同的依赖环境的实例.这种static field是隐含共享的,并且是一种global全局状态,spring同样不推荐这样去做.
2.3 原因总结
- Spring 依赖注入是依赖 set方法
- set方法是是普通的对象方法
- static变量是类的属性
2.4 解决上述问题
@Component
@Slf4j
public class OssUtils {
private static String END_POINT;
@Value("${oss.endpoint}")
private void setEndPoint(String endPoint){
END_POINT = endPoint;
}
private static void createOSSClient(){
String endpoint = END_POINT;
log.info("endpoint的值为:{}",endpoint)
}
}