在一個線程類中爲一個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");
}
}