Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 确保在GUI中只加载一次模块_Java_Guice - Fatal编程技术网

Java 确保在GUI中只加载一次模块

Java 确保在GUI中只加载一次模块,java,guice,Java,Guice,必须处理Guice,我想知道我应该如何处理模块方面的依赖关系 在Guice中,每个模块都由一个实例提供。因此,如果我有一个模块需要某个服务,它会创建一个模块,向该服务添加一个绑定并安装它(binder.install(module)) 现在我有两个独立的模块,它们完全可以独立使用,并且都安装了相同的数据库模块 独立使用这两个模块不会出现问题,但是如果两个模块在同一个应用程序中使用会发生什么?数据库模块将由两个模块独立加载,这是不正确的 有没有办法询问活页夹某一类型是否已经有活页夹?我不能使用ge

必须处理Guice,我想知道我应该如何处理模块方面的依赖关系

在Guice中,每个模块都由一个实例提供。因此,如果我有一个模块需要某个服务,它会创建一个模块,向该服务添加一个绑定并安装它(binder.install(module))

现在我有两个独立的模块,它们完全可以独立使用,并且都安装了相同的数据库模块

独立使用这两个模块不会出现问题,但是如果两个模块在同一个应用程序中使用会发生什么?数据库模块将由两个模块独立加载,这是不正确的

有没有办法询问活页夹某一类型是否已经有活页夹?我不能使用getProvider来检查这一点,因为返回的是一个LookupProvider,不管是否有绑定

那么我们该如何应对这种情况呢

更新:

它无法提供以下功能:

  • 检查给定模块是否已加载
  • 检查给定类是否已绑定
  • 在配置中使用提供者,以便能够进行分布式配置(模块能够配置所贡献的对象)

  • Guice有两个特性来处理这种情况。第一个是模块重复数据消除。这意味着,如果安装了两个等效的模块(通过
    equals()
    hashCode()
    ),则只有一个
    configure()
    方法将运行。然而,这个解决方案有些脆弱,因为它无法经受SPI转换、
    Modules.override()


    第二个也是IMO更好的解决方案是绑定重复数据消除。这意味着Guice将接受完全重复的绑定。因此,如果您的模块将(Interface.class).to(Implementation.class)绑定到(Implementation.class),那么它的
    configure()
    方法是否运行两次都无关紧要,因为Guice可以很好地处理重复绑定。

    因为Guice不支持某些需要的功能,所以必须对其进行仿真。多活页夹代码提供了一个想法。我目前使用的另一个想法是在注入器构建过程中使用反射来查找最顶层的绑定器。知道这个活页夹可以很容易地添加所需的元信息和跟踪某些对象

    一旦构建过程完成,这些元信息将被删除

    通常一次只构建一个注入器,但要确保我们应该防止这种情况

    因此,请看一看单个most绑定器实现(RecordingBinder)。它提供了一个字段父级,我们可以走到根绑定器元素。通常Guice将使用单个most绑定器,但对于专用模块

    另一个不太安全但没有反射的想法是,如果您可以确保一次只生成一个Guice注入器,那么就使用线程本地


    能够识别构建过程并跟踪一次使用哪些构建器,就可以向guice中添加任何类型的附加逻辑,比如防止两次安装依赖项。

    绑定重复数据消除看起来已经添加到guice 4.0中


    所以我需要自己的实现?类似于将模块分组为依赖项,并以某种方式解决依赖项。从代码中,我了解到模块是按从左到右或从前到后的顺序执行的。安装模块的顺序并不重要。这就是为什么没有办法检查是否已经创建了绑定的原因。是的,但是代码只是以这种方式沿着给定的模块列表走。最后,为了克服这个重要的缺点,我需要在Guice代码中添加更多的内容。我添加了第二个答案,描述了我目前所做的事情,但由于你的答案在这个问题上是正确的,我将接受你的答案。感谢您的帮助。基本上我不同意这样的说法:“数据库模块将由两个模块独立加载,这是不正确的。”我认为,如果模块设计正确,安装两次模块是可以的。绑定重复数据消除至少从Guice 3开始就存在了。链接的提交只是更改了多绑定的实现方式。