我正在尝试使用 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);
}
}
Run Code Online (Sandbox Code Playgroud)
我在模块中有一个绑定:
bind(MyClass.class).toProvider(MyClassProvider.class).in(ServletScopes.REQUEST);
Run Code Online (Sandbox Code Playgroud)
我有另一个类 ConsumerClass,它需要使用 MyClass。问题来了,因为dep在某个点之前将为null,我将无法将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();
}
}
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是,当我将 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);
}
}
Run Code Online (Sandbox Code Playgroud)
DependencyClass用。。。来代替Provider<DependencyClass>。Guice 不需要toProvider任何@Provides方法来访问 Guice 可以提供的任何类型的提供者。
这种方式dep只需要在调用 MyProvider 时提供,而不需要实例化。