我正在尝试创建一个可以自动装配T类型对象的类。
@component public class TaskScheduler<T extends TaskService>{ @Autowired private T taskService; }
问题是我有两个扩展的组件TaskService。
TaskService
@component public class firstTaskService extends TaskService { }
和
@component public class secondTaskService extends TaskService { }
因此,当执行此行(ts正在创建)时
ts
@Autowired TaskScheduler<firstTaskService> ts;
我收到此错误:
说明: TaskScheduler中构造函数的参数1需要单个bean,但是找到2
我得到的消息是这样的:
行动: 考虑将一个bean标记为@Primary,更新使用者以接受多个bean,或者使用@Qualifier标识应该消耗的bean。
但是,从我的理解中,@Primary和@Qualifier注解让我选择的组件,这不是我想要的,因为我想用1 firstTaskService和secondTaskService与同一类(TaskScheduler)。
@Primary
@Qualifier
firstTaskService
secondTaskService
TaskScheduler
怎么办呢?
编辑: 澄清:我的目标是将TaskScheduler类与扩展该类的不同类重用TaskService(不要使用TaskService在中一起扩展的多个类TaskScheduler)。
如果要自动连线所有扩展的bean,TaskService也许应该将自动连线字段更改为List:
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以这种方式测试您的: