web-dev-qa-db-ja.com

Spring Boot-開発中に@Cachableを無効にする方法

私は2つのことを探しています:

  1. Springブート「dev」プロファイルを使用して開発中にすべてのキャッシュを無効にする方法。 application.propertiesですべてをオフにするための一般的な設定は継ぎ目がありません。最も簡単な方法は何ですか?

  2. 特定のメソッドのキャッシュを無効にする方法は?私はこのようにSpElを使用しようとしました:

    @Cacheable(value = "complex-calc", condition = "#{${spring.profiles.active} != 'dev'}") public String someBigCalculation(String input){ ... }

しかし、私はそれを機能させることができます。これに関連するSOについての質問がいくつかありますが、それらはXML構成または他のものを参照していますが、Spring Boot 1.3.3を使用しており、これは自動構成を使用しています。

物事を過度に複雑にしたくありません。

16
Wouter

キャッシュのタイプはデフォルトで自動的に検出および設定されます。ただし、spring.cache.typeを構成に追加することにより、使用するキャッシュタイプを指定できます。無効にするには、値をNONEに設定します。

特定のプロファイルに対してそれを行うには、そのプロファイルに追加しますapplication.propertiesこの場合はapplication-dev.propertiesを変更して追加します

spring.cache.type=NONE

これにより、キャッシュが無効になります。

38
M. Deinum

2番目の質問では、次のようにします。

特定のプロファイルがアクティブかどうかを判断するメソッドを記述します(環境は注入された環境です)

boolean isProfileActive(String profile) { 
   return Arrays.asList(environment.getActiveProfiles()).contains(profile);
}

キャッシュ可能なアノテーションのスペル条件にそれを使用します

3
PaulNUK

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プロパティを追加できます。

3
davidxxx