私は2つのことを探しています:
Springブート「dev」プロファイルを使用して開発中にすべてのキャッシュを無効にする方法。 application.propertiesですべてをオフにするための一般的な設定は継ぎ目がありません。最も簡単な方法は何ですか?
特定のメソッドのキャッシュを無効にする方法は?私はこのようにSpElを使用しようとしました:
@Cacheable(value = "complex-calc", condition = "#{${spring.profiles.active} != 'dev'}") public String someBigCalculation(String input){ ... }
しかし、私はそれを機能させることができます。これに関連するSOについての質問がいくつかありますが、それらはXML構成または他のものを参照していますが、Spring Boot 1.3.3を使用しており、これは自動構成を使用しています。
物事を過度に複雑にしたくありません。
キャッシュのタイプはデフォルトで自動的に検出および設定されます。ただし、spring.cache.type
を構成に追加することにより、使用するキャッシュタイプを指定できます。無効にするには、値をNONE
に設定します。
特定のプロファイルに対してそれを行うには、そのプロファイルに追加しますapplication.properties
この場合はapplication-dev.properties
を変更して追加します
spring.cache.type=NONE
これにより、キャッシュが無効になります。
2番目の質問では、次のようにします。
特定のプロファイルがアクティブかどうかを判断するメソッドを記述します(環境は注入された環境です)
boolean isProfileActive(String profile) {
return Arrays.asList(environment.getActiveProfiles()).contains(profile);
}
キャッシュ可能なアノテーションのスペル条件にそれを使用します
David Newcomb comment は真実を伝えます:
spring.cache.type=NONE
はキャッシュをオフに切り替えず、キャッシュされないようにします。つまり、プログラムに27層のAOP /インターセプタースタックを追加します。キャッシュを行わないだけです。それは彼が「すべてをオフにする」という意味に依存します。
このオプションを使用すると、アプリケーションの起動が速くなる可能性がありますが、オーバーヘッドも発生する可能性があります。
1)Spring Cache機能を完全に無効にするには
@EnableCaching
クラスを移動して、有効にするために@Profile
でラップする専用の構成クラスに移動します。
@Profile("!dev")
@EnableCaching
@Configuration
public class CachingConfiguration {}
もちろん、Configuration
環境以外のすべてで有効になっているdev
クラスが既にある場合は、再利用するだけです:
@Profile("!dev")
//... any other annotation
@EnableCaching
@Configuration
public class NoDevConfiguration {}
2)偽の(noop)キャッシュマネージャーを使用する
場合によっては、プロファイルによって@EnableCaching
をアクティブ化しても十分ではありません。クラスの一部またはアプリの一部のSpring依存関係は、Springコンテナからorg.springframework.cache.CacheManager
インターフェイスを実装するBeanを取得するためです。
この場合、正しい方法は、CacheManager
の実装がオーバーヘッドなしで、Springがすべての依存関係を解決できるようにする偽の実装を使用することです。
@Bean
と@Profile
で遊ぶことで実現できます:
import org.springframework.cache.support.NoOpCacheManager;
@Configuration
public class CacheManagerConfiguration {
@Bean
@Profile("!dev")
public CacheManager getRealCacheManager() {
return new CaffeineCacheManager();
// or any other implementation
// return new EhCacheCacheManager();
}
@Bean
@Profile("dev")
public CacheManager getNoOpCacheManager() {
return new NoOpCacheManager();
}
}
または、より適切な場合は、M。Deinumの回答に記載されているのと同じ結果を生成するspring.cache.type=NONE
プロパティを追加できます。