应用场景
大家都知道,Java静态资源(静态代码块,静态方法,静态属性)在类加载的时候进行加载,那么加载时机肯定是在spring对象注入之前的,所以我们在调用实际的静态方法时就会出现空指针。这种可能在实际开发中出现在我们的util工具类中,比如下边这块代码
public class MyUtil {
@Autowired
private B b;
public static void testB(String test) {
b.methodB();
}
}
这块代码可以说是漏洞百出
1、静态方法里边引用了非静态变量b,这个会直接报错的
2、静态方法中引用的b虽然用了@autowired注解,但是该注解的注入是在静态方法加载之后执行的,所以此处的b在使用时为null
3、当一个类包含了@Autowired的子类时,他就必须交给spring来处理而不能使用new来初始化,否则会导致他的自动装配的子类为null。所以如果使用注解的方式,那么我们这个MyUtil 类就需要加上@component注解来交给spring进行初始化。
解决方法
使用PostConstruct注解
PostConstruct标注方法执行时机
完成依赖注入以执行任何初始化之后,在类投入服务之前调用,即:
在spring项目中,在一个bean的初始化过程中,方法执行先后顺序为
Constructor > @Autowired > @PostConstruct
正确代码
@Component
public class MyUtil {
private static MyUtil myUtil;
@Autowired
private B b;
@PostConstruct
public void init(){
myUtil = this;
myUtil.b = this.b;
}
public static void testB(String test) {
myUtil.b.methodB();
}
}