web-dev-qa-db-fra.com

Spring Boot - Comment désactiver @Cachable pendant le développement?

Je cherche 2 choses:

  1. Comment désactiver toute la mise en cache pendant le développement avec le profil "dev" de Spring Boot. Il n'y a pas de paramètre général pour tout désactiver dans application.properties. Quelle est la manière la plus simple?

  2. Comment désactiver la mise en cache pour une méthode spécifique? J'ai essayé d'utiliser SpEl comme ceci:

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

Mais je peux le faire fonctionner. Il y a quelques questions sur SO liées à cela, mais elles se réfèrent à la configuration XML ou à d'autres choses, mais j'utilise Spring Boot 1.3.3 et cela utilise la configuration automatique.

Je ne veux pas trop compliquer les choses.

16
Wouter

Le type de cache est par défaut automatiquement détecté et configuré. Cependant, vous pouvez spécifier le type de cache à utiliser en ajoutant spring.cache.type à votre configuration. Pour le désactiver, définissez la valeur sur NONE.

Comme vous voulez le faire pour un profil spécifique, ajoutez-le à ces profils application.properties dans ce cas, modifiez le application-dev.properties et ajouter

spring.cache.type=NONE

Cela désactivera la mise en cache.

38
M. Deinum

Pour votre deuxième question, faites quelque chose comme ceci:

Écrire une méthode qui détermine si un profil particulier est actif ou non (l'environnement est votre environnement injecté)

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

puis utilisez cela pour votre condition de spel sur l'annotation cacheable

3
PaulNUK

Le commentaire de David Newcomb dit la vérité:

spring.cache.type=NONE ne désactive pas la mise en cache, il empêche les choses d'être mises en cache. c'est-à-dire qu'il ajoute toujours 27 couches de pile AOP/intercepteur à votre programme, c'est juste qu'il ne fait pas la mise en cache. Cela dépend de ce qu'il entend par "éteindre tout".

L'utilisation de cette option peut accélérer le démarrage de l'application mais peut également entraîner des frais généraux.

1) Pour désactiver complètement la fonction Spring Cache

Bouge le @EnableCaching classe dans une classe de configuration dédiée que nous encapsulerons avec un @Profile pour l'activer:

@Profile("!dev")
@EnableCaching
@Configuration
public class CachingConfiguration {}

Bien sûr, si vous avez déjà une classe Configuration qui est activée pour tous sauf l'environnement dev, réutilisez-la simplement:

@Profile("!dev")
//... any other annotation 
@EnableCaching
@Configuration
public class NoDevConfiguration {}

2) Utilisez un faux (noop) gestionnaire de cache

Dans certains cas, l'activation de @EnableCaching par profil n'est pas suffisant car certaines de vos classes ou certaines dépendances Spring de votre application s'attendent à récupérer dans le conteneur Spring un bean implémentant le org.springframework.cache.CacheManager interface.
Dans ce cas, la bonne façon est d'utiliser une fausse implémentation qui permettra à Spring de résoudre toutes les dépendances tandis que l'implémentation de CacheManager est sans surcharge.

Nous pourrions y parvenir en jouant avec @Bean et @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();
    }
}

Ou si cela convient mieux, vous pouvez ajouter le spring.cache.type=NONE propriété qui produit le même résultat que celui écrit dans la réponse M. Deinum.

3
davidxxx