2

让我们考虑一下这种情况 - 有 N 个模块,它们都具有相同接口的服务 ( com.foo.SomeService)。是否可以通过模块名称(my.module)获取此服务,而无需迭代所有模块的所有服务?

4

2 回答 2

3

我不知道这是否是一个真正的问题。选择服务提供者的正确方法是探索其能力,这意味着设计一个好的服务接口,以便消费者有足够的时间选择合适的实现。

如果这个问题是关于配置某些东西以使用特定的服务提供者,那么如果你真的需要,按模块名称选择并不难:

ServiceLoader.load(service).stream()
        .filter(p -> "X".equals(p.type().getModule().getName()))
        .map(Provider::get)
        .findAny();
于 2017-09-19T06:53:18.547 回答
2

ModuleDescriptor.Provides可以提供 Module 提供的服务的名称。

Module module; // representation for your 'my.module'
Set<ModuleDescriptor.Provides> provides = module.getDescriptor().provides();
provides.forEach(p -> {
    System.out.println("service - " + p.service());
    System.out.println("providers - " + p.providers());
});

例如,如果模块声明如下:

module my.module {
    ...
    provides java.lang.reflect.AnnotatedElement with AnnotateElemenImpl; 
}

其中AnnotateElemenImpl类提供了模块接口的AnnotatedElement实现java.lang.reflect。上述共享代码段将返回详细信息:

service - java.lang.reflect.AnnotatedElement
providers - [com.module.AnnotateElemenImpl]
于 2017-09-18T20:08:01.737 回答