2

しばらくの間、プロパティを管理するために使用しているコードがあります。私の上司は、Spring/Guice などの有名なライブラリによってプロパティ管理を行う必要があるという理由で、このソリューションを気に入りませんでした。それは理解できます。代替手段を探していますが、必要な機能を提供するものを見つけることができません (または、それらを適切に使用する方法がわからない可能性があります)。

私が探している機能は次のとおりです。

  1. コーディング中に新しいプロパティをクラスに追加するのが非常に簡単
    1. コンストラクターに触れたり、専用のフィールドやセッターを追加したりする必要はありません
    2. Java コードを使用する (可能な限り)
    3. デフォルトを簡単に追加できます。何かをすばやく構成可能にしてコードを機能させ続けるだけの場合は、プロパティ ファイルを編集する必要はありません。
  2. 任意の型を使用できます (フレームワーク内で String からの変換を定義できます)
  3. 各プロパティの構成読み込み時に実行されるカスタム検証
    1. たとえば、ファイルの存在を確認したり、定義された変換が成功したかどうかを確認したりします。
  4. パラメータを最終フィールドに挿入する機能
  5. プロパティ ファイル TEMPLATE を自動生成する機能
    1. 特に、できれば Java コードで記述を定義し、テンプレートに書き込む能力
  6. スレッドセーフな方法で実行時に構成を更新する機能

これらの機能を提供するライブラリはありますか?

何か不足していて、Spring/Guice ですべて満たすことができる場合、オンラインで適切なリソースはありますか?

私のソリューションの使用例
生成されたプロパティ ファイルのサンプル TEMPLATE (これをコピーして編集します)

4

1 に答える 1

3

コンストラクターに触れたり、専用のフィールドやセッターを追加したりする必要はありません

それは依存性注入パターンではありません。リソース ロケーター パターンを代用することもできますが、それを適切に (特に、テスト容易性を維持する方法で) 行うことは簡単ではありません。セッターを使用すると、テスト対象のクラスを簡単に再構成できます。そのクラスが構成ファイルに依存している場合、単体テストの設定を変更する必要があるときはいつでも別の構成ファイルを作成しますか? 構成クラスをモックしますか? 可能ですが、正確ではありません...

プロパティ ファイル TEMPLATE を自動生成する機能

コメントですでに指摘されているように、古い構成ファイルを移行できないため、これはあまり役に立ちません。

スレッドセーフな方法で実行時に構成を更新する機能

一般に、構成されているコンポーネントからのサポートが必要です (たとえば、スレッド プール サイズの設定を変更するには、ワーカー スレッドの開始/停止が必要です ...)。一般に、それを処理する唯一の簡単な方法は、アプリケーションを再起動することです...

これらの要件を削除すると、Spring のPropertyOverrideConfigurerがうまく適合します。

または、サーブレット コンテナー内で実行する場合は、Spring 構成にJNDI ルックアップを追加できます。

本当にテンプレートを生成したいのであれば、私は既成の解決策を知りません. 私は次のようなことをするかもしれません:

class Configuration {

    int threadCount = 10;

    String secretKey;

    @Description("Number of workers. Default value is number of available cores.")
    int workerThreadCount = Runtime.getRuntime().availableProcessors();

    /** Use default settings */
    Configuration() {

    }

    /** read the settings from the file */
    Configuration(Properties props) {
        for (String prop : props) {
            Field f = getClass().getField(prop);
            f.set(this, props.getValue(prop)); 
            // TODO: type conversion, 
            // e.g. with PropertyEditors, 
            // or Spring's ConversionService, 
            // or invoking the constructor that takes a single string argument, 
            // or ...
        }
    }

    void save() {
        for (Field f : getClass().getFields()) {
            // TODO save the setting
        }
    }
}

デフォルトの設定を書くのは簡単でnew Configuration().save(file)、既存の設定を「new Configuration(file).save(file)」のように簡単にアップグレードできます。

あなたのアプローチとは異なり、このアプローチは静的に型安全であり、冗長な型指定子を使用して構成設定にアクセスするコードを混乱させません。つまり、代わりに

if(config.value(Prop.PROXY_ENABLED,Boolean.class)){

あなたは単に書くことができます

if (config.proxyEnabled) {

また、フィールドはブール型 (ブール型ではない) になる可能性があるため、ここで NullPointerException が発生するリスクさえありません。

于 2012-10-11T00:05:24.850 に答える