5

我有一个 Guice 模块,它有一个 @Provides 方法,它接受 2 个参数并返回接口的实现:

public class **ClientModule** extends **AbstractModule**{

@Override
protected void configure(){

}

@Singleton
@Provides
protected ClientInterfaces provideService(String param1, String param2){
   returns something
 }

}

在注入模块的主类中,如何将参数传递给@Provides 方法?

public MainClass{
main(){
Injector injector = Guice.createInjector( new ClientModule());
MainClass mainClass = injector.getInstance(MainClass.class);

}

这会引发空指针异常 param1

4

2 回答 2

7

您自己不会调用提供方法,当您第一次需要访问(在这种情况下)您的 ClientInterfaces 实现时,Guice 会调用它。

我假设,您需要配置参数来初始化您的 ClientInterfaces。

所以试试Binding-Annotation,最简单的就是@Named:

configure() {
   bindConstant().annotatedWith(Names.named("hostName")).to("myHost");
   bindConstant().annotatedWith(Names.named("port")).to("8080");
}
@Provides
@Singleton
public MyService provideMyService(@Named("hostName") String host, @Named("port") String port) {
   // init MyService 
   return ....
}

当然,您通常会从属性文件 System.props 中读取 myHost 和“8080”,而不是硬编码常量。

第一次需要注入 MyService 时,Guice 会注意到它需要注解字符串以满足提供方法的要求并搜索绑定到注解名称的值......

于 2012-08-27T20:54:34.767 回答
2

您不会将参数传递给提供程序方法。Guice 需要能够自己创建参数。你自己传递参数是没有意义的,因为这样就不需要 Guice。

如果您希望 Guice 能够向 提供参数provideService,则这些参数要么需要在每个参数上绑定注释。由于它们都具有相同的类型,Guice 无法知道它知道如何提供哪些 String 值应该传递给哪个参数。

如果您知道要传递什么param1以及param2从主代码路径传递什么,那么请移到provideService可以直接调用它的地方。在那种情况下不需要Guice。

于 2012-08-27T12:43:33.673 回答