多线程Spring注入对象问题的四种解法
前言
当我们使用多线程时,想给线程注入一个service,但是运行时发现service总是为null。
举个🌰:
public class MyThread implements Runnable {
@Autowired
Service application;
public void run() {
}
}
原因
new Thread不在spring容器中,也就无法获得spring中的bean对象。根据SpringBean的生命周期,能够被Spring管理的Bean都是在扫描范围内并且有 @Componen、@Service、@Configuration
等注释,在使用时才能用IOC注入对象。如果使用new 关键字手动生成的对象,Sring感知不到,无法管理。
解决办法
主要有四种,分为两种思路:
- 继续使用new 关键字
- 依赖通过构造函数传入
- 依赖通过
ApplicationContext
手动获取 - 使用
@Configurable
注解 管理线程内部的依赖
- 不使用new 关键字
- 配合
@Scope("prototype")
使用SpringBean的方式创建线程
- 配合
一 最简单的方法 – 通过构造器传入依赖
public class TaskComments implements Callable<List<String>> {
private RedisClient redisClient;
private TaskComments(RedisClient redisClient){
this.redisClient = redisClient;
}
@Override