SpringBoot自动装配通用类型失败,因为可能有多个bean

我正在尝试创建一个可以自动装配T类型对象的类。

@component    

public class TaskScheduler<T extends TaskService>{

@Autowired

private T taskService;

}

问题是我有两个扩展的组件TaskService

@component

public class firstTaskService extends TaskService {

}

@component

public class secondTaskService extends TaskService {

}

因此,当执行此行(ts正在创建)时

@Autowired

TaskScheduler<firstTaskService> ts;

我收到此错误:

TaskScheduler中构造函数的参数1需要单个bean,但是找到2

我得到的消息是这样的:

考虑将一个bean标记为@Primary,更新使用者以接受多个bean,或者使用@Qualifier标识应该消耗的bean。

但是,从我的理解中,@Primary@Qualifier注解让我选择的组件,这不是我想要的,因为我想用1

firstTaskServicesecondTaskService与同一类(TaskScheduler)。

怎么办呢?

澄清:我的目标是将TaskScheduler类与扩展该类的不同类重用TaskService(不要使用TaskService在中一起扩展的多个类TaskScheduler)。

回答:

如果要自动连线所有扩展的bean,TaskService也许应该将自动连线字段更改为List

@Component    

public class TaskScheduler<T extends TaskService>{

@Autowired

private List<T> taskService;

}

这样,Spring应该放入List所有可扩展的自动装配bean TaskService

:由于您想从动力学上选择TaskService我发现的唯一方法的类型,因此,如下所示。首先,重新定义您的TaskScheduler

public class TaskScheduler <T extends TaskService>{

private T taskService;

public void setTaskService(T taskService) {

this.taskService = taskService;

}

}

您的TaskService子类和相关子类应保持不变。按如下所示设置配置类:

@Configuration

public class TaskConf {

@Autowired

private FirstTaskService firstTaskService;

@Autowired

private SecondTaskService secondTaskService;

@Bean

public TaskScheduler<FirstTaskService> firstTaskServiceTaskScheduler(){

TaskScheduler<FirstTaskService> t = new TaskScheduler<>();

t.setTaskService(firstTaskService);

return t;

}

@Bean

public TaskScheduler<SecondTaskService> secondTaskServiceTaskScheduler(){

TaskScheduler<SecondTaskService> t = new TaskScheduler<>();

t.setTaskService(secondTaskService);

return t;

}

}

然后TaskScheduler以这种方式测试您的:

@Autowired

TaskScheduler<firstTaskService> ts;

以上是 SpringBoot自动装配通用类型失败,因为可能有多个bean 的全部内容, 来源链接: utcz.com/qa/435456.html

回到顶部