【问题标题】:Passing parameters to Guice @Provides method将参数传递给 Guice @Provides 方法
【发布时间】:2016-02-17 17:25:42
【问题描述】:

我有一个 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

【问题讨论】:

  • 您必须在 Guice 模块中声明绑定到 provideService 方法中的参数。

标签: guice


【解决方案1】:

您自己不会调用提供方法,当您第一次需要访问(在这种情况下)您的 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 会注意到它需要对 Strings 进行注解以满足提供方法的要求并搜索绑定到注解名称的值...

【讨论】:

  • 我建议使用自定义绑定注释而不是使用@Named:code.google.com/p/google-guice/wiki/BindingAnnotations。它的代码更多,但我喜欢编译时检查以及任何 IDE 的重命名重构都可以在自定义注释上工作的事实。
  • 当然。但我在这里假设一个初学者水平,不想再打开一个桶......
【解决方案2】:

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

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

如果您知道在主代码路径中为param1param2 传递什么,那么将provideService 移动到可以直接调用的位置。在那种情况下不需要 Guice。

【讨论】:

  • 我发现这个答案比有用更令人困惑。那么,每当我知道,ServiceProvider 需要什么(配置)参数时,就不需要 Guice?
  • 你是对的。我对您的回复投了赞成票,因为我的回复过于仓促并且具有误导性,而您的代码示例使事情变得非常清楚。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-23
  • 2017-01-05
  • 2013-10-04
  • 2013-05-19
  • 2013-02-08
相关资源
最近更新 更多