传递参数与吉斯

传递参数与吉斯

问题描述:

我有一个工厂下面的构造函数,传递参数与吉斯

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!" 
    } 
} 

的很多帮助这里:https://google.github.io/guice/api-docs/latest/javadoc/index.html?com/google/inject/assistedinject/FactoryModuleBuilder.html

+0

不适合我。我有* NullPointerException *,因为从未调用过* Foo *构造函数。可能你需要在某个地方使用你的*模块* – 2013-02-12 23:01:41

+0

请修复“create”方法(FooFactory接口)缺失的返回类型。 它必须是:Foo create(String bar); – frhack 2016-04-29 07:42:49

如果这个类是一个工厂,它应该是一个吉斯管理对象,具有非静态的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了解更复杂工厂的示例。

+0

是的,它很糟糕,结构图比guice更灵活。 – DarthVader 2012-02-11 18:40:30

+0

我可以在哪里下载StructureMap for Java? – mark 2012-08-03 12:52:54

+0

这对我很有效,虽然它不是很漂亮。 – 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; 
    } 
} 

希望它可以帮助别人。