线程 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);
}
}