线程中 run 方法中调用 service 报 java.lang.NullPointerException的解决办法

线程 run 方法中调用 service 报 java.lang.NullPointerException

1.场景

多线程的情况下run方法体中调用业务层的方法。

2.原因

多数情况下Spring框架中使用IOC容器中的bean事先它会初始化好,接下来我们再加以引用对吧。你会用这两个注解@Autowired、@Resource。
但是如果在线程类中要用SpringIOC容器中的bean你用前面的两个注解是不起作用的,因为你的线程类不被Spring管理,在线程中为了线程安全,是防注入的。你品你细品是不是这个样子,这时候你想注入建立关系那是不可能的。
那怎么办呢?项目都已经启动了,这时候是不是还有一种办法可以拿到SpringIOC容器中的bean那就是从我们的上下文ApplicationContext中,没错就是它。

3.解决方法

取类实现ApplicationContextAware接口,编写获取bean的方法即可。
package com.jhkj.td.config;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

@Component
public class GetBeanUtil implements ApplicationContextAware {
private static ApplicationContext applicationContext;

public void setApplicationContext(ApplicationContext context) {
    GetBeanUtil.applicationContext = context;
}

public static Object getBean(String name) {
    return applicationContext.getBean(name);
}

public static ApplicationContext getApplicationContext() {
    return applicationContext;
}

}

4.实现

getBean方法中的"tireRealTimeDataService" 对应 ServiceImpl中的 @Service(“tireRealTimeDataService”)
public void run() {

        try {
        
            TireRealTimeDataService tireRealTimeDataService = (TireRealTimeDataService) GetBeanUtil.getBean("tireRealTimeDataService");

            tireRealTimeDataService.saveOrUpdate(realTimeData);

}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值