今天同事小王遇到了一个问题,他在一个静态方法中想去调用一个@Autowired注解修饰的类,出现的情况就是被调用的一个类一直报null,其实想一想这个问题的出现也是必然的。static方法不需要实例化,静态方法在JVM刚加载的时候就编译过了,在程序的运行过程中随时可以调用,不需要区实例化某个对象后再去调用,可以直接通多类名去调用,直到结束释放内存。在一开始的时候JVM就已经为static方法和方法中的变量分配内存了,注意,但在此时spring boot容器还没有将@Autowire的修饰的类注入到容器中,所以我们在static方法中定义的@Autowired修饰的变量此时为null,后面去调用此方法的时候一直为空。
解决方法:
使用@PostConstruct,@PostConstruct注解是Java提供的一个注解,该注解用来修饰一个非静态的void ()方法。被该注解修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器执行一次。此方法在构造函数之后执行,init()方法之前执行。通常我们回事在Spring框架中使用到@PostConstruct注解,该注解的方法在整个Bean初始化执行顺序:Consturctor(构造方法)->@Autowired(依赖注入)->@PostConstruct(注解的方法)
使用实例:
@Controller
public class MyControllor {
@Autowired
private MyAutowiredmyAutowired; //注入对象
private static MyControllermyController;
@PostConstruct//利用PostConstruct注解初始化赋值
public void init() {
myController =this;
myController.myAutowired =this.myAutowired;
}
public static void myStatic() {
//调用需要的方法
myController.myAutowired.method();
}
}