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);
MyClass を使用する必要がある別のクラス ConsumerClass があります。ここで問題が発生します。特定の時点まで dep が null になるため、MyClass を ConsumerClass に Inject できないため、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 であるため、失敗しました。とにかくプロバイダーの get() メソッドで dep が必要なため、 @Nullable として注釈を付けても問題は解決しません。
get() メソッドが呼び出されたときにのみ、Guice にプロバイダー インスタンスを作成させる方法はありますか? または、この問題に対する他の回避策はありますか?
どうもありがとう。
ジェフ: お返事ありがとうございます。
コードを次のように変更できるということですか。
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);
}
}