リモート サービスのサービス コンポーネントを提供する Spring ライブラリを作成しているとします。サービス コンポーネントは応答データを内部的にキャッシュする必要があり、これには Spring キャッシュが非常に適しています。また、キャッシュをデフォルトのもの (タイムアウト、最大サイズなど) よりも少し高度にする必要があると想像してください。そのため、ライブラリはそれを作成するためのキャッシュ マネージャーを提供します。ただし、サードパーティのキャッシュ マネージャーが、ライブラリが含まれるプロジェクトで使用されるすべてのキャッシュを突然担当することは望ましくありません (プロジェクトには独自のキャッシュがある場合があります)。
私が観察している動作は、プロジェクトが単純な application.properties を使用して構成されたキャッシュを使用している場合 (ehcache としましょう - 以下の例を参照)、構成方法に関係なく、コンポーネントによって提供されるキャッシュマネージャーが呼び出されてすべてのキャッシュを作成することです。コード。これは、プロジェクトが独自のキャッシュ マネージャーを提供していないために発生していますか?
プロジェクトが関与せずに、図書館が提供するサービスでこのようなキャッシングを行うことはできませんか? ライブラリがプロジェクトのキャッシュに干渉することなくキャッシュを提供できることは、ユースケースにとって非常に重要です。
サンプル サービス キャッシュ構成:
@Configuration
public class SpringAceClientCacheConfiguration
{
@Bean
public CacheManager serviceCacheManager()
{
return new GuavaCacheManager("service-data") {
@Override
public Cache getCache(String name) {
Logger.getLogger(getClass().getName()).info("Creating new cache for " + name + "...");
return new GuavaCache(name, CacheBuilder.newBuilder().build());
}
};
}
}
サンプル プロジェクト application.properties:
spring.cache.jcache.config=ehcache3.xml
サンプル プロジェクト ehcache3.xml:
<config xmlns='http://www.ehcache.org/v3'
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jsr107="http://www.ehcache.org/v3/jsr107"
xsi:schemaLocation="http://www.ehcache.org/v3 http://www.ehcache.org/schema/ehcache-core-3.0.xsd
http://www.ehcache.org/v3/jsr107 http://www.ehcache.org/schema/ehcache-107-ext-3.0.xsd">
<cache alias="content">
<heap unit="entries">4096</heap>
<jsr107:mbeans enable-statistics="true"/>
</cache>
</config>
「サービス データ」キャッシュと「コンテンツ」キャッシュの両方のロギング呼び出しが表示されます。サービス キャッシュ構成は、それ自体のサービス データ キャッシュのみを考慮します。プロジェクトが @Primary を使用して別のキャッシュ マネージャーを宣言しなくても、このキャッシュ専用のキャッシュ マネージャーを提供することはできませんか (うまくいくと思いますが、まだ試していません)。
助けてくれてありがとう!