为了账号安全,请及时绑定邮箱和手机立即绑定

由于多个可能的 bean,SpringBoot 自动装配泛型类型失败

由于多个可能的 bean,SpringBoot 自动装配泛型类型失败

慕村9548890 2022-06-30 11:54:47
我正在尝试创建一个自动装配类型 T 的对象的类。@component    public class TaskScheduler<T extends TaskService>{    @Autowired    private T taskService;}问题是我有两个扩展的组件TaskService。@componentpublic class firstTaskService extends TaskService {}和@componentpublic class secondTaskService extends TaskService {}所以当这条线被执行时(ts正在创建)@AutowiredTaskScheduler<firstTaskService> ts;我收到此错误:说明: TaskScheduler中构造函数的参数1需要单个bean,但是找到了2个我收到的消息建议这样做:行动:考虑将其中一个 bean 标记为 @Primary,更新消费者以接受多个 bean,或使用 @Qualifier 来识别应该使用的 bean。但据我了解,@Primaryand@Qualifier注释让我选择了其中一个组件,这不是我想要的,因为我想使用firstTaskService同secondTaskService一个类(TaskScheduler)。怎么可能做到这一点?编辑:澄清:我的目标是重用TaskScheduler具有扩展类的不同类的类(而不是使用在 中一起TaskService扩展的多个类)。TaskServiceTaskScheduler
查看完整描述

1 回答

?
神不在的星期二

TA贡献1963条经验 获得超6个赞

如果您想自动装配所有扩展的 bean,TaskService也许您应该将 autowired 字段更改为List:


@Component    

public class TaskScheduler<T extends TaskService>{

    @Autowired

    private List<T> taskService;

}

这样,Spring 应该放入List所有可自动装配的 beans 扩展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;


查看完整回答
反对 回复 2022-06-30
  • 1 回答
  • 0 关注
  • 239 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信