在Spring中爲Thread注入@Resource失效問題

在一個線程類中爲一個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");
	}
	
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章