@Value对static的属性为什么不可以分析

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)
        }
  }

3 文献来源

为什么@Value对static属性不能注入
解决的方法


版权声明:本文为qq_41967899原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。