我有以下供应商:
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);
如果我尝试手动实例化实例并提供自定义参数,那么注入的参数当然有问题。如果我遵循辅助符号,问题是我需要在模块中注入供应商的工厂,当然,这是完全关闭的!
有人能帮忙吗?
这里有几件事不对:
==
进行比较,将它们与相等的字符串进行比较=
通过引用进行比较,但这两个可能是对相同字符串的不同实例的引用
提供者是一个零参数工厂。如果你有工厂,你不需要供应商
辅助注射与绑定注释(如@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
。
对于所有感兴趣的人,我找到了答案。如果您想将两个注入的和自定义的参数传递给提供程序,请将您注入的参数从构造函数移动到字段,并使用构造函数传递您自己的参数。绑定时,首先创建一个你的提供者的实例,将你的参数传递给构造函数,然后在这个实例上调用请求注入,以便将它添加到注入图中,然后将你的类绑定到提供者实例,如下所示:
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用不同的方法生成一个。