[英]Is it possible to get service by module name in Java 9?
让我们考虑情况-有N个模块,并且所有模块都具有相同接口的服务( com.foo.SomeService
)。 是否可以通过模块名称( my.module
)获得此服务,而无需迭代所有模块的所有服务?
我不知道这是不是一个真正的问题。 选择服务提供商的正确方法是探究其功能,这意味着设计一个良好的服务接口,以便消费者有足够的能力来选择适当的实现。
如果这个问题是关于配置某些东西以使用特定的服务提供商的,那么如果您确实需要:通过模块名称进行选择就不难了:
ServiceLoader.load(service).stream()
.filter(p -> "X".equals(p.type().getModule().getName()))
.map(Provider::get)
.findAny();
ModuleDescriptor.Provides
可以提供模块提供的服务的名称。
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
类从java.lang.reflect
模块提供接口AnnotatedElement
的实现。 上面的共享代码段将返回以下详细信息:
service - java.lang.reflect.AnnotatedElement
providers - [com.module.AnnotateElemenImpl]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.