静态方法里边如何使用spring的注入对象

时间:2025-02-15 21:01:34

应用场景

大家都知道,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();
    }
}