Java—获取客户端包中可用的接口的所有实现
我正在开发一个任务调度器,它使用executor服务并行触发任务。我希望使我的任务调度器成为通用的,并且无论何时添加任何新类型的任务,都不会在调度器代码库中更改代码/减少代码更改 我的任务(主要是客户机包)可以是任何类型,基本上只接受特定的请求并执行任务 为了做到这一点,我公开了接口(比如ITask),它必须由任务(将在其他一些应用程序/包上)实现,并且将有一个实现方法,比如示例Java—获取客户端包中可用的接口的所有实现,java,spring,multithreading,reflection,interface,Java,Spring,Multithreading,Reflection,Interface,我正在开发一个任务调度器,它使用executor服务并行触发任务。我希望使我的任务调度器成为通用的,并且无论何时添加任何新类型的任务,都不会在调度器代码库中更改代码/减少代码更改 我的任务(主要是客户机包)可以是任何类型,基本上只接受特定的请求并执行任务 为了做到这一点,我公开了接口(比如ITask),它必须由任务(将在其他一些应用程序/包上)实现,并且将有一个实现方法,比如示例 doTask(IRequest request); 因此,使用案例是,如果任何客户机希望使用my schedule
doTask(IRequest request);
因此,使用案例是,如果任何客户机希望使用my scheduler framework/API触发其作业,只需将my package添加到其依赖项中和rest(即,获取实现ITask的任务类列表>使用executor service进行调度>重试失败的任务>最终提供整个任务状态)应该由我的调度API负责
这样做的最佳方式是什么。我在考虑Junit如何获得其@Test方法(基于注释)的解决方案,无论是谁,只要在包中添加Junit依赖项,我都希望获得基于接口的类。您已经用Spring标记了这个问题,但在问题的任何地方都没有提到您正在使用Spring框架。这个答案有几个假设:
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
}