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