Spring Cache - Créer un KeyGenerator personnalisé

Spring Cache - Création d'un KeyGenerator personnalisé

1. Vue d'ensemble

Dans ce rapide tutoriel, nous allons illustrer comment créer un générateur de clé personnalisé avec Spring Cache.

Pour une introduction au module ci-dessus, veuillez vous référer àto this article.

2. KeyGenerator

Ceci est responsable de la génération de chaque clé pour chaque élément de données dans le cache, qui serait utilisée pour rechercher l'élément de données lors de l'extraction.

L'implémentation par défaut ici est le commutateurSimpleKeyGenerator – qui utilise les paramètres de méthode fournis pour générer une clé. Cela signifie que si nous avons deux méthodes qui utilisent le même nom de cache et le même ensemble de types de paramètres, il y a une forte probabilité que cela entraîne une collision.

Cela implique également que les données en cache peuvent être écrasées par une autre méthode.

3. PersonnaliséKeyGenerator

UnKeyGeneratordésire implémenter une seule méthode:

Object generate(Object object, Method method, Object... params)

S'il n'est pas mis en œuvre ou utilisé correctement, cela peut entraîner l'écrasement des données du cache.

Regardons la mise en œuvre:

public class CustomKeyGenerator implements KeyGenerator {

    public Object generate(Object target, Method method, Object... params) {
        return target.getClass().getSimpleName() + "_"
          + method.getName() + "_"
          + StringUtils.arrayToDelimitedString(params, "_");
    }
}

Après cela, nous avons deux façons de l'utiliser; le premier est de déclarer un bean dans lesApplicationConfig.

Il est important de noter que la classe doit s'étendre à partir deCachingConfigurerSupport ou implémenterCacheConfigurer:

@EnableCaching
@Configuration
public class ApplicationConfig extends CachingConfigurerSupport {

    @Bean
    public CacheManager cacheManager() {
        SimpleCacheManager cacheManager = new SimpleCacheManager();
        Cache booksCache = new ConcurrentMapCache("books");
        cacheManager.setCaches(Arrays.asList(booksCache));
        return cacheManager;
    }

    @Bean("customKeyGenerator")
    public KeyGenerator keyGenerator() {
        return new CustomKeyGenerator();
    }
}

La deuxième façon consiste à l'utiliser uniquement pour une méthode particulière:

@Component
public class BookService {

    @Cacheable(value = "books", keyGenerator = "customKeyGenerator")
    public List getBooks() {
        List books = new ArrayList<>();
        books.add(new Book("The Counterfeiters", "André Gide"));
        books.add(new Book("Peer Gynt and Hedda Gabler", "Henrik Ibsen"));
        return books;
    }
}

4. Conclusion

Dans cet article, nous avons exploré un moyen d'implémenter lesKeyGenerator d'un Spring Cache personnalisé.

Comme toujours, le code source complet des exemples est disponibleover on GitHub.