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