Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java—获取客户端包中可用的接口的所有实现_Java_Spring_Multithreading_Reflection_Interface - Fatal编程技术网

Java—获取客户端包中可用的接口的所有实现

Java—获取客户端包中可用的接口的所有实现,java,spring,multithreading,reflection,interface,Java,Spring,Multithreading,Reflection,Interface,我正在开发一个任务调度器,它使用executor服务并行触发任务。我希望使我的任务调度器成为通用的,并且无论何时添加任何新类型的任务,都不会在调度器代码库中更改代码/减少代码更改 我的任务(主要是客户机包)可以是任何类型,基本上只接受特定的请求并执行任务 为了做到这一点,我公开了接口(比如ITask),它必须由任务(将在其他一些应用程序/包上)实现,并且将有一个实现方法,比如示例 doTask(IRequest request); 因此,使用案例是,如果任何客户机希望使用my schedule

我正在开发一个任务调度器,它使用executor服务并行触发任务。我希望使我的任务调度器成为通用的,并且无论何时添加任何新类型的任务,都不会在调度器代码库中更改代码/减少代码更改

我的任务(主要是客户机包)可以是任何类型,基本上只接受特定的请求并执行任务

为了做到这一点,我公开了接口(比如ITask),它必须由任务(将在其他一些应用程序/包上)实现,并且将有一个实现方法,比如示例

doTask(IRequest request);
因此,使用案例是,如果任何客户机希望使用my scheduler framework/API触发其作业,只需将my package添加到其依赖项中和rest(即,获取实现ITask的任务类列表>使用executor service进行调度>重试失败的任务>最终提供整个任务状态)应该由我的调度API负责


这样做的最佳方式是什么。我在考虑Junit如何获得其@Test方法(基于注释)的解决方案,无论是谁,只要在包中添加Junit依赖项,我都希望获得基于接口的类。

您已经用Spring标记了这个问题,但在问题的任何地方都没有提到您正在使用Spring框架。这个答案有几个假设:

  • 您正在使用Spring框架
  • 所需接口的实现已配置为Springbeans
  • 如果您获得了对ApplicationContext的访问权(请参阅接口ApplicationContextAware),则可以使用它查找特定类型的SpringBean。它看起来像这样:

    Map<String, ITask> beans = appContext.getBeansOfType(ITask.class);
    

    这种方法显然有点危险,因为它要求您能够为找到的每个候选对象构造一个新实例。因此,这不是理想的解决方案。

    谢谢@rmlan。到目前为止,我还没有包括春天。我的代码是核心java。如果有任何替代方法可以在java中不使用spring,我更愿意这样做,因为添加spring会导致巨大的依赖性。如果没有其他的选择,那么我会考虑起诉Spring,我还需要我的客户为ITASK实现中的每一个声明bean。为什么你要标记这个问题Spring?我遇到几个帖子,在那里我看到了Spring的解决方案。我的错是,我没有提到我在寻找什么样的解决方案。
    private String configuredListOfBasePackages;
    
    public void someMethod () {
        ClassPathScanningCandidateComponentProvider scanner = new ClassPathScanningCandidateComponentProvider(false);
        scanner.addIncludeFilter(new AssignableTypeFilter(ITask.class));
        Set<BeanDefinition> iTaskCandidates = scanner.findCandidateComponents(configuredListOfBasePackages);
        // do stuff with the bean definitions
    }