当前位置: 首页 > 知识库问答 >
问题:

如何将注入参数和辅助参数传递给Guice提供者?

谷梁云瀚
2023-03-14

我有以下供应商:

  public class GuiceResourceProvider implements Provider<WebResource> {

    @Inject
    private Configuration configuration;
    @Inject
    private Environment environment;

    private String name;

    @Inject
    public GuiceResourceProvider(@Assisted("name") String name) {
        this.name = name;
    }

    @Override
    public WebResource get() {
        if (name == "default") {
            String connectionsDSResourceUrl = "http://localhost:" + this.configuration.getHttpConfiguration().getPort();
            Client connectionsDSHttpClient = new JerseyClientBuilder().using(this.configuration.getHttpClientConfiguration()).using(this.environment).build();
            connectionsDSHttpClient.addFilter(new RequestIdClientFilter());
            return connectionsDSHttpClient.resource(connectionsDSResourceUrl);
        } else if(name == "other"){
            return ......
        }
    }
}

我需要创建这个提供程序的两个实例,一个将绑定一个用“默认”注释的网络资源注入,另一个将绑定一个用“其他”注释的网络资源注入。

让Guice创建提供程序实例如下:

    bind(WebResource.class).annotatedWith(Names.named("default")).toProvider(GuiceResourceProvider.class).in(Scopes.SINGLETON);
bind(WebResource.class).annotatedWith(Names.named("other")).toProvider(GuiceResourceProvider.class).in(Scopes.SINGLETON);

如果我尝试手动实例化实例并提供自定义参数,那么注入的参数当然有问题。如果我遵循辅助符号,问题是我需要在模块中注入供应商的工厂,当然,这是完全关闭的!

有人能帮忙吗?

共有2个答案

夹谷山
2023-03-14

这里有几件事不对:

  • 不要将字符串==进行比较,将它们与相等的字符串进行比较=通过引用进行比较,但这两个可能是对相同字符串的不同实例的引用
  • 提供者是一个零参数工厂。如果你有工厂,你不需要供应商
  • 辅助注射与绑定注释(如@Named)不同。绑定注释只是查找提供者的映射键的一半(类或TypeLiteral是另一半)。辅助注射允许您在注射时获取一个或多个参数,并自动连接一个为您执行此操作的界面。如果在单个工厂方法中接受多个相同参数类型,则辅助注入参数仅接受@Assisted(“foo”)注释;否则Guice会明白的
  • 从注入的依赖项中读取绑定注释中的参数值没有好方法——但是由于具有不同参数值的绑定注释彼此不相等,因此可以分别绑定每个注释

我认为你的逻辑最好用@提供的方法:

public class WebResourceModule extends AbstractModule {

  @Override public void configure() { }

  @Provides @Named("default") @Singleton WebResource makeDefaultResource(
      Configuration configuration, Environment environment) {
    String connectionsDSResourceUrl = "http://localhost:" + this.configuration.getHttpConfiguration().getPort();
    Client connectionsDSHttpClient = new JerseyClientBuilder().using(this.configuration.getHttpClientConfiguration()).using(this.environment).build();
    connectionsDSHttpClient.addFilter(new RequestIdClientFilter());
    return connectionsDSHttpClient.resource(connectionsDSResourceUrl);
  }

  @Provides @Named("other") @Singleton WebResource makeOtherResource(
      YourDependencies here) {
    return somethingElse();
  }
}

但是,如果您想使用自定义工厂逻辑获取任何字符串,只需创建一个不实现Provider的方法可注入类,并使用它创建并返回任何您想要的WebResource

田向荣
2023-03-14

对于所有感兴趣的人,我找到了答案。如果您想将两个注入的和自定义的参数传递给提供程序,请将您注入的参数从构造函数移动到字段,并使用构造函数传递您自己的参数。绑定时,首先创建一个你的提供者的实例,将你的参数传递给构造函数,然后在这个实例上调用请求注入,以便将它添加到注入图中,然后将你的类绑定到提供者实例,如下所示:

GuiceResourceProvider guiceResourceProvider = new GuiceResourceProvider("default");
requestInjection(guiceResourceProvider);

绑定(WebResource.class)。注释为(Names.named(“默认”))。TopProvider(guiceResourceProvider)。in(Scopes.SINGLETON);

这是提供商:

public class GuiceResourceProvider implements Provider<WebResource> {

@Inject
private Configuration configuration;
@Inject
private Environment environment;

private String name;

@Inject
public GuiceResourceProvider(String name) {
    this.name = name;
}

@Override
public WebResource get() {
    if (name == "default") {
        String connectionsDSResourceUrl = "http://localhost:" + this.configuration.getHttpConfiguration().getPort();
        Client connectionsDSHttpClient = new JerseyClientBuilder().using(this.configuration.getHttpClientConfiguration()).using(this.environment).build();
        connectionsDSHttpClient.addFilter(new RequestIdClientFilter());
        return connectionsDSHttpClient.resource(connectionsDSResourceUrl);
    } else if(name == "other"){
        return ......
    }
}

}

 类似资料:
  • 我正在使用Guice Assisted Inject库为我建立一个工厂。我目前的设置如下: 这迫使我使用< code > factory . create controller(first,factory . create second(first))显式创建一个< code>SecondDep。是否可以更改我的绑定,这样我就可以简单地执行< code > factory . create con

  • 问题内容: 在SQL Server 2014中,我试图创建一个动态的WHERE子句。 我已将查询构建为字符串,但是当我尝试使用sp_executesql执行查询时,出现以下错误:提示 13您必须声明标量变量“ @desde”。 我不知道如何使sp_executesql识别输入参数。 问题答案: 代替 使用 您必须定义在动态查询中使用的参数,例如 请参考sp_executesql 否则,您可以将动态

  • 问题内容: 我正在A中使用RUN指令安装rpm 但是,我想将值“ 2.3”作为参数传递。我的RUN指令应类似于: 哪里 问题答案: 您正在寻找和指导。这些是Docker 1.9中的新功能。查看https://docs.docker.com/engine/reference/builder/#arg。这将允许您添加到,然后使用构建。

  • 问题内容: 我的工厂如下 这是Foo的定义: 好。我不确定如何使用Guice将此参数传递给Foo构造函数? 有任何想法吗? 问题答案: 所有“ Guice构造函数参数”答案在某种程度上似乎都不完整。这是一个完整的解决方案,包括用法: //在实现类上注释构造函数和辅助参数 //使用仅接受辅助参数的create()方法创建工厂接口。 // FooFactory接口没有显式的实现类(Guice Magi

  • 我有一个非常简单的场景可以使用 DI 解决,但我无法找到合适的示例/文档来帮助我完成。我是Scala/Guice世界的新手。 当前组件看起来像这样 现在,我在Foo和Bar之间有一个依赖项。所以,通常代码看起来像这样 其中只是返回。当然,为了简洁起见,我删除了工厂/助手。 我意识到,当我使用“new”时,这已经脱离了DI范式。我希望确保可以基于参数将Bar注入FooImpl。有点像使用工厂。我们如

  • 我有这个接口和简单的实现: 我想使用Guice用不同的方法生成一个。