我正在尝试使用Google Guice进行一些后期绑定。
public class MyClassProvider implements Provider<MyClass>{
private DependencyClass dep;
private WebService webservice;
@Inject
MyClassProvider(DependencyClass dep, WebService webservice){
this.dep = dep;
this.webservice = webservice;
}
public MyClass get() {
MyClass myclass = webservice.call(dep);
}
}
我在模块中有一个绑定:
bind(MyClass.class).toProvider(MyClassProvider.class).in(ServletScopes.REQUEST);
我有另一个类ConsumerClass,它需要使用MyClass。这里出现了问题,因为dep会在某个点之前为空,我将无法将MyClass注入到ConsumerClass中,因此我注入了Provider。
public class ConsumerClass {
private MyClassProvider myClassProvider;
@Inject
public ConsumerClass(Provider<MyClass> myClassProvider){
this.myClassProvider = myClassProvider;
}
......
public void myfunction() {
// Here dep is initialized and become non-null here.
// Then, I call
MyClass myClass = myClassProvider.get();
}
}
我遇到的问题是,当我将MyClassProvider注入ConsumerClass时,它尝试创建一个MyClassProvider实例,因为当时dep为null,它失败了。将它注释为@Nullable并不能解决我的问题,因为无论如何我需要在提供者的get()方法中使用dep。
有没有办法让Guice只在调用get()方法时才创建提供者实例?或者还有其他解决这个问题的方法吗?
非常感谢。
您的意思是我可以将我的代码更改为:
public class MyClassProvider implements Provider<MyClass>{
private Provider<DependencyClass> depProvider;
private WebService webservice;
@Inject
MyClassProvider(Provider<DependencyClass> depProvider, WebService webservice){
this.depProvider = depProvider;
this.webservice = webservice;
}
public MyClass get() {
DependencyClass dep = depProvider.get();
MyClass myclass = webservice.call(dep);
}
}
答案 0 :(得分:2)
将DependencyClass
替换为Provider<DependencyClass>
。 Guice不需要toProvider
或@Provides
方法来访问Guice可以提供的任何类型的提供商。
只有在调用MyProvider时才需要提供dep
,而不是实例化。