一. 发现问题

在使用框架写项目时,可能会遇到某些静态方法需要依赖被容器管理的类,如下所示

1
2
3
4
5
6
7
8
public class Test {
@Autowired
private static UserService userService;

public static void method(){
// 调用userService
}
}

但是运行起来后,会报 java.lang.NullPointerException 异常。

这是因为 静态变量类变量 不是对象的属性,而Spring注入的是在容器内的 实例化对象,因此会导致无法注入。

一般来说,不建议在静态方法中调用Spring的实例对象,但是非要用不可呢?

二. 解决方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Component
public class Test {

private static UserService userService;

@Autowired
public void setUserService(UserService userService){
Test.userService = userService;
}

public static void method(){
// 调用userService
}
}

当我们把Test类放入容器管理(注意这点,否则依旧会报错),通过方法来注入时即可解决问题。

当然,如果你有更好的方法,可以在下方评论!