如何在Guice 4.1中注入依赖于另一个值的属性?

时间:2018-01-22 03:50:57

标签: java guice

我有一个由几个模块消耗的服务,并且在每个模块中,它定义了自己的提供者,用于提供依赖于另一个值的值。我不想拥有该对象中的所有其他值,而是直接使用该单个值,但是没有办法将Guice的bindConstant()用于提供者。

当前的Psuedo代码:

ConfigurationProvider implements Provider<Configuration> {
    final Configuration configuration;
    @Inject
    public ConfigurationProvider(BuildConfiguration buildConfiguration) {
        configuration = new Configuration();
        configuration.setDownloadPath(buildConfiguration.getBuildPath() + File.separator + "downloads");
    }

    public Configuration get() {
        return configuration;
    }
}

模块内部:

bind(Configuration.class).toProvider(ConfigurationProvider.class);

相反,我想在可能的情况下使用我的属性注入,并且只做这样的事情:

    DownloadPathProvider implements Provider<Property<DownloadPath, String>> {
     final String downloadPath;
     @Inject public DownloadPathProvider(BuildConfiguration buildConfiguration) {
      downloadPath = buildConfiguration.getBuildPath() + File.separator + "downloads";
     }

     public String get() {
         return downloadPath;
     }
}

我认为问题在于bindConstant可以工作,我需要在初始化模块时确定该值。但是这种情况下的值是后来派生的(实际上是通过另一个提供者)。

虽然它可以将配置放在一个简单的pojo中,但我觉得直接使用属性会更简洁,而不是将它嵌入pojo中。

配置或值实际上是一个常量,因为一旦设置,它就永远不会改变。我只是希望将该值基于另一个值。

2 个答案:

答案 0 :(得分:0)

如果在模块创建时未修复此值,则该值不是常量。它实际上是一个单身人士。而不是使用bindConstant(),只需bind().in(Scope.Singleton)

答案 1 :(得分:0)

因为我想能够直接注入原始类型,所以我必须要有创意......

  1. 将ComputedProperty接口声明为ConfigurableProperty
  2. 的子接口
  3. 实现可以访问已设置属性的ComputedPropertySource。 ComputedPropertySource的优先级较低,并且在其他属性源已经运行之后运行。
  4. 从其他属性查找中排除ComputedProperty
  5. 为需要&#34;计算&#34;
  6. 的任何属性扩展此接口

    在运行时,属性源按顺序运行,计算属性最后运行。

    有点hackish,我会看看我是否可以将其清理一下,然后发布代码以使其工作。