传递参数与吉斯
我有一个工厂下面的构造函数,传递参数与吉斯
public final class Application {
private static IFoo foo;
public static IFoo getFoo(String bar)
{
// i need to inject bar to the constructor of Foo
// obvious i have to do something, not sure what
Injector injector = Guice.createInjector();
logger = injector.getInstance(Foo.class);
return logger;
}
}
这是foo的定义:
class Foo
{
Foo(String bar)
{
}
}
确定。我不知道我怎么可以将这个参数传递给Foo与Guice的构造函数?
任何想法?
所有“Guice构造函数参数”答案在某种程度上似乎不完整。 这里是一个完整的解决方案,包括用法:
interface FooInterface{
String getFooName();
}
//注释构造函数和辅助参数的实现类
class Foo implements FooInterface {
String bar;
@Inject
Foo(@Assisted String bar)
{
this.bar = bar;
}
// return the final name
getFooName(){
return this.bar;
}
}
//使用,需要一个create()方法工厂接口只有辅助参数。 // FooFactory接口没有明确的实现类(吉斯魔术)
interface FooFactory{
Foo create(String bar);
}
//该工厂绑定到
binderModule implements Module{
void configure(Binder binder) {
binder.install(new FactoryModuleBuilder()
.implement(FooInterface.class, Foo.class)
.build(FooFactory.class));
}
}
通过AssistedInject
创建了提供商//现在使用它:class FooAction{
@Inject private FooFactory fooFactory;
doFoo(){
// Send bar details through the Factory, not the "injector"
Foo f = fooFactory.create("This foo is named bar. How lovely!");
f.getFooName(); // "This foo is named bar. How lovely!"
}
}
如果这个类是一个工厂,它应该是一个吉斯管理对象,具有非静态的getFoo方法,和的getFoo方法只是将使用
new Foo(bar)
不是每个类都需要由吉斯被实例化。
另请参阅AssistedInject,避免自己创建该工厂,让Guice为您创建一个工厂。
你可能要找的是使用Guice工厂。 AssistedInject
功能特别容易,但他们有一个manual example at the top of the page。手动示例的缺点是,您在非静态方法getFoo
中获得工厂,您可以将任何参数传递给您需要的参数,并从此处构建对象。
如果您在Foo
中有拦截方法,这将不会直接工作,但它可以在其他许多情况下使用。
要使用AssistedInject
,这对我有几分更清楚的语义,并意味着更少的人工接线,你会当创建Foo
(当然,FooImpl
,我们应该使用接口)需要guice-assistedinject扩展的类路径,则:
@Inject
public FooImpl(@Assisted String bar)
{
this.baz = bar;
}
然后创建一个FooFactory
接口:
public interface FooFactory {
public Foo create(String bar);
}
您吉斯模块中
然后:
install(new FactoryModuleBuilder()
.implement(Foo.class, FooImpl.class)
.build(FooFactory.class));
您可以查看javadoc for FactoryModuleBuilder
了解更复杂工厂的示例。
是的,它很糟糕,结构图比guice更灵活。 – DarthVader 2012-02-11 18:40:30
我可以在哪里下载StructureMap for Java? – mark 2012-08-03 12:52:54
这对我很有效,虽然它不是很漂亮。 – 2014-12-29 23:41:09
我知道THA这是旧线程,但我今天就自己遇到了这个问题。 我只需要两个或最多三个不同的'Foo'实例,我真的不想写出Factory的所有bolierplate代码。 随着一点谷歌搜索,我发现这Stubbisms – Tony’s Weblog我会建议这个解决方案,这是完美的,如果你确切知道你需要什么样的实例。
在吉斯模块:
bind(Foo.class).annotatedWith(Names.named("firstFoo")).toProvider(new Provider<Foo>() {
@Override
public Foo get() {
return new FooImpl("topic A");
}
});
bind(Foo.class).annotatedWith(Names.named("secondFoo")).toProvider(new Provider<Foo>() {
@Override
public Foo get() {
return new FooImpl("topic B");
}
});
或者在Java 8:
bind(Foo.class).annotatedWith(Names.named("firstFoo")).toProvider(() -> new FooImpl("first"));
bind(Foo.class).annotatedWith(Names.named("secondFoo")).toProvider(() -> new FooImpl("second"));
而且在服务的构造函数,你需要的Foo实例:
@Inject
public MyService (
@Named("firstFoo") Foo firstFoo,
@Named("secondFoo") Foo secondFoo) {
}
在
和Foo我案例:
public class FooImpl implements Foo {
private String name;
public FooImpl(String name) {
this.name = name;
}
@Override
public String getName() {
return name;
}
}
希望它可以帮助别人。
不适合我。我有* NullPointerException *,因为从未调用过* Foo *构造函数。可能你需要在某个地方使用你的*模块* – 2013-02-12 23:01:41
请修复“create”方法(FooFactory接口)缺失的返回类型。 它必须是:Foo create(String bar); – frhack 2016-04-29 07:42:49