Spring 容器所管理的主要是对象实例,而@Autowired 依赖注入的都是容器内的对象实例,在 Java 中 static
修饰的静态属性(变量和方法)是属于类的,而非属于实例对象。当类加载器加载静态变量时,Spring上下文尚未加载完成,则类加载器不会在 Bean 中正确注入属性。如下是一个错误的例子:
@Component
public class Test {
@Autowired
private static UserServie userServie;
// 编译正常,但调用此静态方法时会报userService的空指针异常
public static void test() {
userServie.func();
}
}
- 办法1:
@Autowired
+ 构造器
@Component
public class Test {
private static UserServie userServie;
@Autowired
public Test(UserServie userServie) {
Test.userServie = userServie;
}
}
- 办法2:
@Autowired
+setter
@Component
public class Test {
private static UserServie userServie;
@Autowired
public void setUserServie(UserServie userServie){
Test.userServie = userServie;
}
}
- 办法3:
@Autowired
+@PostConstruct
@Component
public class Test {
private static UserServie userServie;
@Autowired
private UserServie autowiredUserServie;
@PostConstruct
private void beforeInit() {
Test.userServie = this.autowiredUserServie;
}
}
- 办法4:
SpringApplicationContextUtil
public class Test {
public static void test() {
UserServie userServie = SpringApplicationContextUtil.getBean("userServie");
userServie.func();
}
}