文章524
标签277
分类67

Spring中使用Value注解注入static属性的问题

今天在写项目的时候使用了@Value注解在static属性上注入了值, 启动项目后一直报NPE, 后来才发现spring中不能直接向static属性注入值


无法注入的原因

由于在Spring中@Value注入的原理是依赖于setter方法的: 而static属性使用的不是普通的setter方法(使用static setter), 所以无法直接注入(被置为null)

如下方法:

1
2
3
4
5
@Component
public class Test {
@Value("${url}")
public static String url;
}

说明:

本意是通过ApplicationContext载入配置文件, 并将url值注入字段, 实际上属性值为null!


注入static属性的方法

① xml通过bean注入

配置例如:

Util.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Class Util{
private static XXX xxx;
public void setXxx(XXX xxx){
this.xxx = xxx;
}
public void getXxx(){
return xxx;
}
public static void method1(){
xxx.func1();
}
public static void method2(){
xxx.func2();
}
}

application.xml

1
2
3
<bean value="test" class="x.x.x.Util">
<property value="xxx" ref="xxx"/>
</bean>

② 通过setter方法

1
2
3
4
5
6
7
8
9
@Component
public class Test {
public static String url = "/dev/xx";

@Value("${url}")
public static void setUrl(String url) {
Test.url = url;
}
}

③ 通过中间变量赋值

1
2
3
4
5
6
7
8
9
10
11
12
@Component
public class Test {
public static String url = "/dev/xx";

@Value("${url}")
public String tempUrl = "/dev/xx";

@PostConstruct
public void init() {
url = tempUrl;
}
}

说明:

这里使用到了@PostConstruct注解:

从Java EE5规范开始,Servlet增加了两个影响Servlet生命周期的注解(Annotation): @PostConstruct和@PreConstruct; 这两个注解被用来修饰一个非静态的void()方法, 而且这个方法不能有抛出异常声明

  • @PostConstruct说明:

    被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器调用一次,类似于Serclet的init()方法;

    被@PostConstruct修饰的方法会在构造函数之后,init()方法之前运行


  • @PreConstruct说明:

    被@PreConstruct修饰的方法会在服务器卸载Servlet的时候运行,并且只会被服务器调用一次,类似于Servlet的destroy()方法;

    被@PreConstruct修饰的方法会在destroy()方法之后运行,在Servlet被彻底卸载之前



本文作者:Jasonkay
本文链接:https://jasonkayzk.github.io/cn/2020/01/14/Spring%E4%B8%AD%E4%BD%BF%E7%94%A8Value%E6%B3%A8%E8%A7%A3%E6%B3%A8%E5%85%A5static%E5%B1%9E%E6%80%A7%E7%9A%84%E9%97%AE%E9%A2%98/
版权声明:本文采用 CC BY-NC-SA 3.0 CN 协议进行许可