本文介紹了桂斯:怎么做后期裝訂?的處理方法,對(duì)大家解決問(wèn)題具有一定的參考價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧!
問(wèn)題描述
我正在嘗試使用Google Guice進(jìn)行一些后期綁定。
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);
}
}
我在模塊中有一個(gè)綁定:
bind(MyClass.class).toProvider(MyClassProvider.class).in(ServletScopes.REQUEST);
我還有另一個(gè)類Consumer erClass,它需要使用MyClass。現(xiàn)在問(wèn)題來(lái)了,因?yàn)閐ep在某個(gè)點(diǎn)之前將是空的,我將無(wú)法將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();
}
}
我遇到的問(wèn)題是,當(dāng)我將MyClassProvider注入到Consumer erClass時(shí),它試圖創(chuàng)建MyClassProvider的一個(gè)實(shí)例,因?yàn)楫?dāng)時(shí)dep為空,所以失敗了。將其注釋為@Nullable并不能解決我的問(wèn)題,因?yàn)闊o(wú)論如何我都需要在提供程序的get()方法中使用dep。
有什么方法可以讓Guice僅在調(diào)用get()方法時(shí)創(chuàng)建提供程序?qū)嵗龁幔窟€有沒(méi)有其他辦法來(lái)解決這個(gè)問(wèn)題?
非常感謝。
杰夫:謝謝你的回復(fù)。
您的意思是我可以將代碼更改為以下代碼:
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
方法即可訪問(wèn)Guice可以提供的任何類型的提供程序。
這種方式dep
只需要在調(diào)用MyProvider時(shí)提供,而不需要實(shí)例化。
這篇關(guān)于桂斯:怎么做后期裝訂?的文章就介紹到這了,希望我們推薦的答案對(duì)大家有所幫助,