DIフレームワークとしてgoogle guiceを中継するJava Webアプリケーションで適切なプロパティ管理戦略を作成したいと考えています。Google Guiceのプロパティ管理
Iは、以下の3つの要件応答機構がしたい:私はプロパティにアクセスできるようにしたいGuiceの(@Named)
- を
- このメカニズムはプロパティの優先順位付けをサポートする必要があります。つまり、ある値でプロパティを展開された戦闘でラップすることができますが、ターゲットシステムレベルまたはローカルファイルシステム(ターゲットマシン私は展開します)、そのような場合には、戦争の価値は値thによって上書きされますatはターゲットマシンに存在します。
これは標準的な要件です。今、Guiceの標準バインダーを使用して、私は簡単に最初の要件を得ることができますが、他の2つはありません。
- ラップをし、例えばGuiceのの結合メソッド(プロパティを結合したもの)を公開:
public static void bindString(AnnotatedBindingBuilder<String> binder, String property, String defaultValue) { binder.annotatedWith(Names.named(property)).toInstance(getProperty(property, defaultValue)); }
他の二つを取得するには、私は次のことを行い自分のクラスを作成しましたgetPropertyメソッドは、プロパティを処理する方法(戦争またはシステムレベルから値を取得する方法)を知っており、プロパティも静的に公開しています。
プロパティバインディングのために作成したこのユーティリティを使用している限り、基本的にすべての要件がカバーされますが、標準のguiceバインディングを使用すると、2番目と3番目の要件が失われます。
guiceバインディングをオーバーライドして、これら3つの要件をすべて満たす方法はありますか?
私は春に基づいたアプリで同じ挑戦をしていて、かなり簡単でした。私は、以下の方法でApplicationContextInitializerを実装:
@Override public void initialize(ConfigurableWebApplicationContext ctx) { PropertySource<Map<String, Object>> localProps = null; try { localProps = new ResourcePropertySource(new ClassPathResource(LOCAL_PROPERTIES_FILE_NAME)); } catch (IOException e) { LOG.fatal("Could not load local properties from classpath " + LOCAL_PROPERTIES_FILE_NAME); return; } LOG.info("Loaded configuration from classpath local file " + LOCAL_PROPERTIES_FILE_NAME); ctx.getEnvironment().getPropertySources().addFirst(localProps); }
をので、これは私に私の環境に最も高い優先順位を持つローカルのプロパティを追加する方法を与えました。戦争の特性と重複した場合には、地方のものが優先された。さらに私は自分の環境を静的に公開しているので、プロパティ(コンテナによって管理されていないサービス、ほとんどはレガシー)に対して静的にアクセスできます。
私はguiceでこれをどのように達成できますか?
あなたは、静的な方法でプロパティにアクセスすることを、何を意味するのですか?つまり、特定のプロパティにアクセスするユースケースがありますが、アクセスするプロパティを実行時まで知ることはできませんか? –
私は次のようなものを使ってプロパティにアクセスしたいと思っています:SomeClass.getProperty( "my.property");これはguiceによって管理されていないクラス(通常はレガシー)で、まだ自分のプロパティへのアクセスが必要な場合に便利です – forhas