SpringBoot @Autowired用在static上

在SpringBoot开发中,有时候我们可能会需要把一个静态的bean标记为@Autowired来让Spring帮我们注入

但是在直接使用中,Spring是无法注入这个类的,奇怪的是Spring不把这种使用方法视为错误,没有任何的提示

先分析原因,在java中要使用到一个类的时候,是由类加载器来加载这个类的

在类加载器加载这个类的时候,类加载器就会分析这个类中的静态成员然后创建并初始化

但是在类加载器加载类中静态值的时候,仍未加载Spring上下文,所以会导致类加载器无法正确地将bean注入到静态变量中,所以会导致这个静态值被自动初始化为null,所以如果直接调用这个类可能会发生空指针异常

比如下面这种用法

@Autowired
public static Test test;

解决方案:

可以利用Spring中的@PostConstruct注解

@PostConstruct注解可以在依赖关系注入完毕之后立即执行,可以用这个来对类进行初始化

用这个注解来注解一个初始化函数就可以达到为静态类加载填充内容的效果

比如

@Component
public class TestClass {
   private static Test test;

   @Autowired
   private Test autowiredTest;

   @PostConstruct
   private void init() {
      test = this.autowiredTest;
   }
}

注意这个init函数是不能带有参数的,这个方法的内容会在填充完成后自动由Spring调用

然后为这个test设计一个getter或者其他调用函数,就可以直接使用了