首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有反射的模块化公共闭包原则

带有反射的模块化公共闭包原则
EN

Stack Overflow用户
提问于 2018-04-07 03:01:02
回答 1查看 74关注 0票数 1

有了这个maven项目结构

代码语言:javascript
复制
root pom
     ---> ModuleCore/pom.xml
     ---> ModuleA/pom.xml
     ---> ModuleB/pom.xml
     ---> ModuleC/pom.xml
     ---> ModuleD/pom.xml

其中模块A, B, C and D与模块Core有依赖关系,也假设ModuleAModuleB有依赖关系,ModuleBModuleC有依赖关系。

对于这种依赖分布,我们同意:

如果我修改

代码语言:javascript
复制
  ModuleCore

必须进行版本设置

代码语言:javascript
复制
  ModuleA/pom.xml
  ModuleB/pom.xml
  ModuleC/pom.xml
  ModuleD/pom.xml

如果我更新ModuleD,没有人需要更新版本。

如果我更新ModuleC

必须进行版本设置

代码语言:javascript
复制
  ModuleA/pom.xml
  ModuleB/pom.xml

好了,在整个解释之后,我想要实现的是模块之间没有相互依赖关系,而只是与ModuleCore相关

我第一次尝试是将接口创建为协定,以便在模块之间通信,并将协定放在moduleCore中,然后通过reflectionclasspath中查找接口的实现并调用来调用实现。但我觉得倒影看起来很粗糙,

谁能给我一些建议,如何应用公共闭包原则,而不是将所有代码都移到ModuleCore中,并使其成为一个整体?

我使用反射的第一种方法的代码示例。

代码语言:javascript
复制
@Test
void dependencyWithModuleA() {
    Reflections reflections = new Reflections("com.modularization.ccp");
    Optional<Optional<?>> any = reflections.getSubTypesOf(MainA.class)
            .stream()
            .map(clazz -> {
                try {
                    MainA mainA = clazz.newInstance();
                    return Optional.of(mainA.main());
                } catch (InstantiationException | IllegalAccessException e) {
                    e.printStackTrace();
                }
                return Optional.empty();
            }).findAny();
    if (any.isPresent() && any.get().isPresent()) {
        System.out.println(any.get().get());
    }

}

重要的是要澄清它将在服务启动时完成的反射调用,以及它将使用单例模式保存的实例引用,以避免性能问题。

请对此方法的所有批评,它将是非常欢迎的。

致以问候。

EN

回答 1

Stack Overflow用户

发布于 2018-04-09 00:14:52

从问题上的标签来看,这个问题似乎仅限于Java 8。

看一下内置在JDK中的ServiceLoader类。您可以在META-INF/package.MainA文件中声明MainA的实现-在每个ModuleA-D jars中。然后找到这些实现:

代码语言:javascript
复制
ServiceLoader.load(MainA.class).iterator()

在Java 9中,情况发生了一些变化。现在,JDK9模块可以直接声明它的服务,但仍然可以通过ServiceLoader发现它们,因此这种方法也具有一定的未来校验性。

显然,在JDK之外也有相当多的解决方案,例如Spring有自动装配,或者ApplicationContext.getBeansOfType(Class),Java有javax.enterprise.inject.Instance,还有OSGi,等等。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49699472

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档