3

プロパティファイルを1つのクラスにロードし、アプリケーション全体でそのクラスを使用して取得しています。

public class PropertiesUtil extends PropertyPlaceholderConfigurer {

    private static Map<String, String> properties = new HashMap<String, String>();

    @Override
    protected void loadProperties(final Properties props) throws IOException {
        super.loadProperties(props);
        for (final Object key : props.keySet()) {
            properties.put((String) key, props.getProperty((String) key));
        }
    }

    public String getProperty(final String name) {
        return properties.get(name);
    }

}

およびApplicationContext.xml

    <bean id="propertiesUtil"
        class="com.test.PropertiesUtil">
        <property name="locations">
            <list>
                <value>classpath:test/test.properties</value>
            </list>
        </property>
    </bean>

ここで、プロパティファイルが変更されるたびに再ロードされることを確認したいと思います。

Tomcatサーバーと一緒に初期化するリスナークラスが1つあります。そして私はファイルウォッチャーのために以下のロジックを書きました

TimerTask task = new FileWatcher(new File("c:\\temp-reb\\config\\config.properties")) {
    /*
     * (non-Javadoc)
     * @see com.belgacom.rosy.rebecca.utils.FileWatcher#onChange(java.io.File)
     */
    @Override
    protected void onChange(File file) {
        loadServiceProperties(file);
        loadMetadata();
    }
};

Timer timer = new Timer();
timer.schedule(task, new Date(), Long.valueOf(properties.getProperty("properties.file.timer.schedule"))); // repeat the check every second

問題は

  1. FileWatcherを実行するにはパスが必要ですが、ハードコーディングしたくありません
  2. プロパティを呼び出して明示的にリロードするようにSpringに指示するにはどうすればよいですか?
4

2 に答える 2

3
  1. FileWatcherを実行するにはパスが必要ですが、ハードコーディングしたくありません

メソッドを使用して取得できる、同じプロジェクトフォルダ内のリソースディレクトリのような相対パスを指定するだけですgetResource()また、 systemプロパティuser.dirを使用して、use作業ディレクトリのようにアクセスすることもできます。

File f = new File(System.getProperty("user.dir")+ "/test.properties");
System.out.println(f.getAbsolutePath());

2.プロパティを呼び出して明示的にリロードするようにspringに指示するにはどうすればよいですか。

あなたがそれをしている方法は、現在私には大丈夫のようです。他の方法もあるかもしれませんが、上記のプロセスに欠陥は見られません。

于 2012-12-11T06:48:59.833 に答える
1

これは本当に暗い場所に通じる曲がりくねった道です。定義ごとのSpringは、シングルトンへの参照をインスタンス化して維持します。したがって、クライアントに依存関係が注入され、それを維持し、アプリケーションコンテキストが新しいBeanの配信を開始すると、本当に醜い状態になります。プロパティをBeanプロパティとして使用しない場合は問題ありませんが、これを混合することは実際には方法ではありません。

どちらかといえば、プロパティをリロードして影響を受けるBeanの数を制限し、それらを特別なスコープに配置しようとします。このようにして、スコープが変更されるたびに、最新の構成を持つ新しいBeanを取得します。少なくとも、プロパティのライフサイクルが定義されており、何に反対しているのかを正確に把握できます。

于 2012-12-11T07:19:05.247 に答える