答えを見つけようとして大量のstackoverflowやその他のリソースを読みましたが、おそらくそれがわかりません。
アプリケーションのクライアント コードのいくつかのウィジェットとクラスに GIN @Singleton を挿入しようとしています。Spring を使用すると、正しいアノテーションを使用するだけで、ほぼどこにでも何でも注入できます。GWT と GIN を使用すると、コンストラクター以外の場所に注入できないようです。私は非常に大規模なプロジェクトに取り組んでおり、ほとんど不可能であるため、コンストラクターに注入したくありません。
これらのクラスには、ウィジェットとそうでないものがあります。それらはアプリケーション全体で使用され、注入されるものもあれば、new によってインスタンス化されるものもあれば、両方を持つものもあるため、コンストラクターの変更はさらに困難になります。
コードを次のように動作させたいのですが、GIN でどのように動作するかわかりません。
@Singleton
public class ApplicationData {
public AppInfo getAppInfo() {
return new AppInfo("My App Info");
}
}
public class MyClass{
@Inject protected ApplicationData applicationData;
public void someMethod() {
doSomething(applicationData.getAppInfo());
}
}
他の誰かがこれをプレゼンターで動作するようにコーディングしました。なぜそれが動作するのかはある程度理解していますが、概念を完全には理解していません。彼らはもはや尋ねることはありません。
これが機能するように私が持っているハックですが、私はそれが好きではありません:
@GinModules(GinModule.class)
public interface Injector extends Ginjector {
final Injector INSTANCE = GWT.create(Injector.class);
ApplicationData getApplicationData();
}
public class MyWidget extends Composite implements TakesValue<Integer>{
public static interface MyWidgetUiBinder extends UiBinder<FormPanel, MyWidget>}
private MyWidgetUiBinder uiBinder = GWT.create(MyWidgetUiBinder.class);
private ApplicationData appData;
public ArrivalTimeWidget() {
appData = Injector.INSTANCE.getApplicationData();
initWidget(uiBinder.createAndBindUi(this));
someMethod(appData.getAppInfo());
}
}
ハックを使用する代わりに、これを正しく行うのを手伝ってください。そして、これに関しては、私はばかなので、完全な説明を付けて、私をばかのように扱ってください。