繁体   English   中英

在Java 9中是否可以通过模块名称获得服务?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM