私の全体的な目標は、プロパティファイルからプロパティをロードし、それらのプロパティを自分のオブジェクトに挿入することです。 Guiceを使って特定のシングルトンクラスをインスタンス化するためにこれらのプロパティを使用したいと思います。私のシングルトンクラスは、次のようになります。ランタイムパラメータで設定されたGuiceからシングルトンを取得するにはどうすればよいですか?
public class MainStore(){
private String hostname;
@Inject
public void setHostname(@Named("hostname") String hostname){
this.hostname = hostname;
}
public MainStore(){
System.out.println(hostname);
}
}
私はこのプロバイダを使用してシングルトンのインスタンスを作成しようとしている:
public class MainStoreProvider implements Provider<MainStore> {
@Override
public MainStore get(){
MainStore mainStore = new MainStore();
return mainStore;
}
}
マイconfigurationModuleは、実行時に指定されたプロパティファイルから設定をロードするモジュールです。
public class ConfigurationModule extends AbstractModule {
@Override
protected void configure(){
Properties properties = loadProperties();
Names.bindProperties(binder(), properties);
}
private static Properties loadProperties() {
String resourceFileName = "example.properties";
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
InputStream inputStream = classLoader.getResourceAsStream(resourceFileName);
Properties properties = new Properties();
properties.load(inputStream);
return properties;
}
}
そして、私のexample.propertiesファイルが含まれています
私はメインシングルトンを必要とするときそして、私が使用している:
Injector injector = Guice.createInjector(new ConfigurationModule());
MainStoreProvider mainStoreProvider = injector.getInstance(MainStoreProvider.class);
MainStore mainStore = mainStoreProvider.get(); //MainClass singleton
はこれがダウンする正しい道ですか?私はこれをまったく別のやり方で行うべきですか? MainStoreが正しいホスト名を表示しないのはなぜですか?
のシングルトンを作成します。なぜ最初にプロバイダーが必要ですか? guiceはあなたのクラス構築を処理していないので、プロパティを設定しません。プロバイダ実装にプロパティを注入し、作成後にプロパティを設定する必要があります。また、私が間違っている場合は私を修正しますが、あなたのプロバイダはシングルトンを作成せず、毎回新しいインスタンスを作成します。 – pandaadb
私はシングルトンを提供するためにプロバイダを使用したいと思います。私はそれをする方法がわからないので、おそらくそれは間違っている。また、Guiceは、Injectedプロパティをプロバイダで作成されたすべてのクラスにカスケードすると考えました。このアプローチは完全に間違っているかもしれません。 – Grammin
いいえ、guiceではなく、オブジェクトを作成する人であるため、guiceはあなたのために行いません。あなたのホスト名が間違って印刷される理由は、コンストラクタでそれを表示するが、メソッドを注入するからです。メソッドの注入は、オブジェクトが構築された後にのみ起こります(それ以外の方法はありません)。シングルトンが必要な場合は、シングルトンスコープでバインドして、単純にプロパティをコンストラクタに挿入します(メソッドを実行するのと同じです)。あなたのプロパティは、Guice Managedクラスにインジェクトできる名前付き文字列オブジェクトと考えてください。 – pandaadb