在一个线程类中为一个service对象添加@Resource注解。
public class CalculateThread extends Thread {
@Resource
private MyService myService;
}
在controller层的一个方法里面通过构造函数实例化这个线程类,但是实例化之后那个myService却是null。
@Controller
@RequestMapping("${adminPath}/calculate/salaryCalculate")
public class SalaryCalculateController{
@RequestMapping(value = "/doCalculate")
public String doCalculate() {
CalculateThread calculateThread = new CalculateThread();
Thread myThread = new Thread(calculateThread);
myThread.start();
}
}
解决方法:
通过ApplicationContext来获取对象。
1、创建一个ApplicationContext操作类
@Service
public class SpringContextHolder implements ApplicationContextAware {
private static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
SpringContextHolder.applicationContext = applicationContext;
}
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
/**
* 根据name获取Service层对象
* @param beanName
* @return
*/
public static Object getBean(String beanName) {
return applicationContext.getBean(beanName);
}
/**
* 根据name和class获取Service层对象
* @param beanName
* @param clazz
* @return
*/
public static <T>T getBean(String beanName, Class<T> clazz) {
return applicationContext.getBean(beanName, clazz);
}
2、在controller中通过注解注入SpringContextHolder,并且把它通过线程的构造函数传递进去。
@Controller
@RequestMapping("${adminPath}/calculate/salaryCalculate")
public class SalaryCalculateController{
@Resource
private SpringContextHolder springContextHolder;
@RequestMapping(value = "/doCalculate")
public String doCalculate() {
CalculateThread calculateThread = new CalculateThread(springContextHolder);
Thread myThread = new Thread(calculateThread);
myThread.start();
}
}
3、在线程类的构造函数中加载myService
public class CalculateThread extends Thread {
private SpringContextHolder springContextHolder;
private MyService myService;
public CalculateThread(SpringContextHolder springContextHolder) {
super();
/* 在线程对象中无法通过spring注入service, 需要通过springContextHolder加载获取 */
this.springContextHolder = springContextHolder;
this.myService= (MyService ) springContextHolder.getBean("myService");
}
}