Springboot在静态方法中调用Service或mapper,初始化后会出现空指针错误:java.lang.NullPointerException。
首先,这涉及到代码执行优先级的问题,在一个Java类中,存在着静态代码块,静态方法,构造函数,成员方法等等。不同形式的代码执行顺序不同:执行顺序优先级:
静态代码块>静态方法>构造函数(此时通过@Autowired修饰的成员变量为null)>bean注入>@PostConstruct注解的init函数
代码块 | 描述 |
---|---|
静态代码块 | 当类被载入时,静态代码块被执行,且只被执行一次 |
静态方法 | 在不创建对象的情况下即可执行,可以直接用类名调用。 |
构造函数 | 创建类对象的时候执行 |
成员函数 | 当被对象调用的时候执行 |
代码示例。
@Component
public class TestUtil {
@Autowired
private InfoService infoService;
private static TestUtil testUtil;
@PostConstruct
public void init() {
testUtil =this;
testUtil.infoService=this.infoService;
}
}
如果我们希望某个bean的初始化发生在第被一次引用,而不是项目一启动就就进行初始化,我们可以通过@Lazy标签进行延迟注入。