我有一个Guice模块,它有一个@Provides方法,它接受2个参数并返回接口的实现:
public class **ClientModule** extends **AbstractModule**{
@Override
protected void configure(){
}
@Singleton
@Provides
protected ClientInterfaces provideService(String param1, String param2){
returns something
}
}
在我注入模块的主类中,如何将params传递给@Provides方法?
public MainClass{
main(){
Injector injector = Guice.createInjector( new ClientModule());
MainClass mainClass = injector.getInstance(MainClass.class);
}
抛出Null指针异常param1
答案 0 :(得分:5)
您自己不调用提供方法,当您首次需要访问(在本例中)ClientInterfaces Implementation时,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会注意到它需要带注释的字符串才能满足提供方法的要求并搜索绑定到Annotatioon名称的值...
答案 1 :(得分:1)
您不会将参数传递给提供程序方法。 Guice需要能够自己创建参数。你自己传递参数是没有意义的,因为那时不需要Guice。
如果您希望Guice能够为provideService
提供参数,那么这些参数将需要每个参数binding annotation。由于它们都具有相同的类型,因此Guice无法知道应该为哪个参数传递它知道如何提供的String值。
如果您知道从主代码路径传递param1
和param2
的内容,请将provideService
移动到可以直接调用的位置。在那种情况下不需要Guice。