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

应用场景

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

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jarbein

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值