4

構成データを提供する春のサービスがあります。サービスが GUI によって呼び出されると、データベースから構成データがロードされます。これは、単一のリクエストのレンダリング中に頻繁に発生することがわかりました。構成データをキャッシュしてこれを最適化したい。ただし、これが適切なプログラミング スタイルなのか、それともサービスでインスタンス変数を持つことが "許可" されているのかはわかりません。

これが私がやろうと思っていることのいくつかのサンプルコードです:

@Serivce("MyConfigService")
public class MyConfigServiceImpl implements MyConfigService {

    private Config cachedConfig;

    @Override
    public Config loadConfig() {
        if (cachedConfig != null) {
            // load config
            cachedConfig = loadedConfig;
        }
        return cachedConfig;
    }

    @Override
    public saveConfig(Config config) {
        cachedConfig = null;
        // save the configuration
    }
}
4

3 に答える 3

4

インスタンス変数 (Spring によって管理されない) を持つと、サービスがスレッドセーフでなくなる可能性が生じます。そのため、それらを回避するか、スレッドセーフであることを確認します。

目標を達成するために@configurable、注釈を参照することをお勧めします。@postconstuct

于 2013-02-22T13:21:36.940 に答える
2

インスタンス変数はSpringサービスレイヤークラスで許可されていますか? もちろん。

Configここでオブジェクトへの参照を保存するために使用するのは良い考えですか?

多分そうでないかもしれません。

Config通常どのようにロードされるかを示していません...同じConfigインスタンスがすべてのユーザーに返されますか? つまり、User1 が呼び出すとsaveConfig、User2 が User2 を呼び出すと、 User1 が保存されloadConfigたオブジェクトを取得します。Config

その場合、問題なく値をキャッシュできるはずです。

また、自分で実装する代わりに、Spring のアノテーション ベースのキャッシングを使用することもできます。

于 2013-02-22T13:15:49.263 に答える
0

インスタンス変数は、Spring IoC コンテナーのすべてです。あなたの設計で疑わしいのは、独自の遅延読み込みロジックが含まれていることです。loadConfigこれは、Spring に任せなければならない懸念事項ですlazy-init=true(または同様に、正確には覚えていません)。設計には、おそらくルックアップ メソッドと、場合によってはリクエスト スコープの Bean も含まれます。

于 2013-02-22T13:00:40.583 に答える