在Spring中为Thread注入@Resource失效问题

2 篇文章 0 订阅

在一个线程类中为一个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");
	}
	
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值