23

Java で書かれた監視ソフトウェアの場合、Google Guice を DI プロバイダーとして使用することを検討しています。プロジェクトは、外部リソース (ファイルまたはデータベース) から構成をロードする必要があります。アプリケーションは、スタンドアロン モードまたはサーブレット コンテナーで実行するように設計されています。

現時点では、構成には依存性注入のバインディングまたはパラメーターは含まれておらず、一部のグローバル アプリケーション設定 (JDBC 接続定義および関連するデータベース管理/監視オブジェクト) のみが含まれています。

2 つのオプションが表示されます。

  • ファイルと JDBC 構成ソース (およびその他の多く) をサポートするApache Commons Configurationなどの別のライブラリを使用するには

また

  • guice-xml-config のような Guice 用のファイルベースのアドオンを使用して、アプリケーション オプションを保存します (これにより、後で必要になった場合に DI 部分を構成できます)。

両方のタスクに Guice を使用することをお勧めしますか、それとも一般的なアプリケーション構成を依存性注入とは別にしておくことをお勧めしますか? メリットとデメリットのうち、最も重要なものはどれだと思いますか?

4

4 に答える 4

37

Guice モジュールでプロパティ ファイルを丸呑みするのは簡単です。

public class MyModule extends AbstractModule {

  @Override
  protected void configure() {
    try {
        Properties properties = new Properties();
        properties.load(new FileReader("my.properties"));
        Names.bindProperties(binder(), properties);
    } catch (IOException ex) {
        //...
    }
  }
} 

後で、プロパティから他の構成ソースに簡単に切り替えることができます。

[編集]

ところで、 で注釈を付けることで、注入されたプロパティを取得できます@Named("myKey")

于 2011-01-26T14:58:20.630 に答える
5

ガバネーター ライブラリを確認します。

https://github.com/Netflix/governator/wiki/Configuration-Mapping

@Configuration アノテーションといくつかの構成プロバイダーを取得します。コードでは、構成パラメーターがどこで使用されているかを確認するのに役立ちます。

@Configuration("configs.qty.things")
private int   numberOfThings = 10;

また、起動時に素敵な構成レポートが表示されます。

https://github.com/Netflix/governator/wiki/Configuration-Mapping#configuration-documentation

于 2014-01-24T13:36:05.813 に答える
2

私は自分のプロジェクトで同じ問題に遭遇しました。私たちはすでに Guice を DI フレームワークとして選択しており、物事をシンプルに保つために、構成にも Guice を使用したいと考えていました。

Guice FAQ How do I inject configuration parameters?で提案されているように、 Apache Commons Configurationを使用してプロパティ ファイルから構成を読み取り、それらを Guice インジェクターにバインドすることになりました。.

@Override public void configure() {
    bindConstant().annotatedWith(ConfigurationAnnotation.class)
        .to(configuration.getString("configurationValue"));    
}

Commons Configuration でサポートされている構成の再読み込みも、Guice インジェクションに非常に簡単に実装できます。

@Override public void configure() {
    bind(String.class).annotatedWith(ConfigurationAnnotation.class)
        .toProvider(new Provider<String>() {
            public String get() {
                return configuration.getString("configurationValue");
            }
    });    
}
于 2013-06-20T04:46:41.980 に答える