guice - 如何将注入(inject)参数和辅助参数传递给 Guice Provider?

标签 guice

我有以下供应商:

  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 ......
        }
    }
}

我需要创建此 Provider 的 2 个实例,一个将绑定(bind)一个带有“default”注释的 WebResource 注入(inject),一个将绑定(bind)一个带有“other”注释的 WebResource 注入(inject)。

让 Guice 创建 Provider 实例如下:

    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);

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

有人能帮忙吗?

最佳答案

对于可能感兴趣的每个人,我找到了答案。 如果您想将注入(inject)参数和自定义参数都传递给提供者,请将注入(inject)参数从构造函数移至字段,并使用构造函数传递您自己的参数。绑定(bind)时,首先创建 Provider 的一个实例,将参数传递给构造函数,然后在该实例上调用 requestInjection 以将其添加到注入(inject)图中,然后将您的类绑定(bind)到 Provider 实例,如下所示:

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

绑定(bind)(WebResource.class).annotatedWith(Names.named("default")).toProvider(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 - 如何将注入(inject)参数和辅助参数传递给 Guice Provider?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15065943/

相关文章:

java - 从 Guice 模块调用方法?

java - Guice 创建异常 - 无限制辅助

java - Shiro:即使现有 session 已经通过其他领域进行了身份验证,也强制进行第二个领域身份验证

java - MyBatis 多个数据源使用单个映射器

java - 工厂模式 : Validating input when creating a bean (Guice/Guava)

java - 与 Java 相比,Scala 对于泛型和通配符有哪些机制?

google-app-engine - 带有 Google Cloud Endpoints 和 Guice 的 Appengine

dependency-injection - 你可以在持久实体中使用依赖注入(inject)吗?

java - 我在资源中注入(inject)了服务接口(interface),但无法弄清楚如何配置资源方法调用

scala - 使用 Guice 绑定(bind)/注入(inject) Scala 函数(不是整个类)?