Je cherche 2 choses:
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?
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.
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.
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
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.