原因就是spring和多线程安全的问题,不让注入
解决方案有以下几种
一.变量前缀加static,生成set方法并加上@Resource,记住把set方法 static 去掉,否则会抛出 @Resource annotation is not supported on static fields
private static VerificDao verificDao;
@Resource
public void setVerificDao(VerificDao verificDao) {
CheckVoiceVerify.verificDao = verificDao;
}
- 1
- 2
- 3
- 4
- 5
二.根据spring上下文环境获取bean
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
@Component
public class SpringContextUtil implements ApplicationContextAware {
// Spring应用上下文环境
private static ApplicationContext applicationContext;
/**
* 实现ApplicationContextAware接口的回调方法,设置上下文环境
*/
public void setApplicationContext(ApplicationContext applicationContext)
throws BeansException {
SpringContextUtil.applicationContext = applicationContext;
}
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
/**
* 获取对象 这里重写了bean方法,起主要作用
*/
public static Object getBean(String beanId) throws BeansException {
return applicationContext.getBean(beanId);
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
三. 在启动这个线程的时候,在这个线程的构造函数中把需要注入的对象传过去
new Thread(new CheckVoiceVerify(verifyService)).start();