繁体   English   中英

SpringBoot自动装配泛型类型因多个可能的bean而失败

[英]SpringBoot Autowiring a generic type fails because of multiple possible beans

我正在尝试创建一个自动装配类型为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注释让我选择了一个组件,这不是我想要的,因为我想使用firstTaskServicesecondTaskService与同一个类( TaskScheduler )。

怎么可以这样做?

编辑:澄清:我的目标是重用TaskScheduler类和扩展TaskService类的不同类(不要使用在TaskScheduler一起扩展TaskService多个类)。

如果您想要自动连接所有扩展TaskService bean,您可以将自动连接字段更改为List

@Component    
public class TaskScheduler<T extends TaskService>{
    @Autowired
    private List<T> taskService;
}

通过这种方式,Spring应该在List放入所有可扩展TaskService autowireable bean。

编辑 :因为你想在dinamically中选择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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM