本文介紹了桂斯:怎么做后期裝訂?的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
我正在嘗試使用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);
我還有另一個類Consumer erClass,它需要使用MyClass?,F(xiàn)在問題來了,因為dep在某個點之前將是空的,我將無法將MyClass注入Consumer erClass,因此我注入了提供者。
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注入到Consumer erClass時,它試圖創(chuàng)建MyClassProvider的一個實例,因為當時dep為空,所以失敗了。將其注釋為@Nullable并不能解決我的問題,因為無論如何我都需要在提供程序的get()方法中使用dep。
有什么方法可以讓Guice僅在調用get()方法時創(chuàng)建提供程序實例嗎?還有沒有其他辦法來解決這個問題?
非常感謝。
杰夫:謝謝你的回復。
您的意思是我可以將代碼更改為以下代碼:
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);
}
}
推薦答案
DependencyClass
替換為Provider<DependencyClass>
。Guice不需要toProvider
或@Provides
方法即可訪問Guice可以提供的任何類型的提供程序。
這種方式dep
只需要在調用MyProvider時提供,而不需要實例化。
這篇關于桂斯:怎么做后期裝訂?的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,