其他分享
首页 > 其他分享> > 简单分析@Value是否赋值给静态变量

简单分析@Value是否赋值给静态变量

作者:互联网

经常使用@Value复制给成员变量,但是静态变量能复制吗?答案是否定的,不能够生效。

编写一个实例如下:

@RestController
@RequestMapping("/health")
public class HelloController {

    @Value("${env}")
    private String env;

    @Value("${env2}")
    private static String env2 = "static";

    @RequestMapping("/check")
    public String check() {
        String s = env + " " + env2;
        System.out.println(s);
        return s;

    }
}

在yaml文件中配置

env : qsm
env2 : qsm2

接下来启动程序,并访问http://localhost:8080/health/check
发现打印的为qsm static
代表对静态变量赋值没有生效。

那么具体原因呢?
类加载过程中,使用类加载器加载java字节码到jvm中,对于静态变量会有准备和初始化2个地方有处理,前置是赋值初始值,后者赋值我们自己定义的值。所以这个时候,静态变量从属于类的。
【重点】:而Spring管理的是【对象】,而不是类。所以Spring是不推荐去赋值给静态变量的。

那么就没有办法赋值了吗?还是有办法的,即使用setter方法上注入,setter方法去掉static

    @Value("${env2}")
    public  void setEnv2(String env2) {
        HelloController.env2 = env2;
    }
/*
    public static void setEnv2(String env2) {
        HelloController.env2 = env2;
    }
*/

这个时候,再次访问地址,就可以得到qsm qsm2。此时就代表赋值成功了。

【完,喜欢就点个赞呗】

正在去往BAT的路上修行

标签:String,静态,env2,Value,static,变量,赋值
来源: https://blog.csdn.net/u013541707/article/details/112351878