Spring Cache - Erstellen eines benutzerdefinierten KeyGenerators

Spring Cache - Erstellen eines benutzerdefinierten KeyGenerators

1. Überblick

In diesem kurzen Lernprogramm wird veranschaulicht, wie mit Spring Cache ein benutzerdefinierter Schlüsselgenerator erstellt wird.

Eine Einführung in das obige Modul finden Sie unterto this article.

2. KeyGenerator

Dies ist dafür verantwortlich, jeden Schlüssel für jedes Datenelement im Cache zu generieren, das zum Nachschlagen des Datenelements beim Abrufen verwendet wird.

Die Standardimplementierung hier istSimpleKeyGenerator – , das die bereitgestellten Methodenparameter zum Generieren eines Schlüssels verwendet. Dies bedeutet, dass bei zwei Methoden, die denselben Cache-Namen und denselben Parametertyp verwenden, eine hohe Wahrscheinlichkeit besteht, dass dies zu einer Kollision führt.

Dies impliziert auch, dass die Cache-Daten durch eine andere Methode überschrieben werden können.

3. BenutzerdefinierteKeyGenerator

EinKeyGeneratormuss nur eine einzige Methode implementieren:

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

Wenn es nicht korrekt implementiert oder verwendet wird, kann es zum Überschreiben von Cache-Daten führen.

Schauen wir uns die Implementierung an:

public class CustomKeyGenerator implements KeyGenerator {

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

Danach haben wir zwei Möglichkeiten, es zu verwenden; Die erste deklariert eine Bohne inApplicationConfig.

Es ist wichtig zu beachten, dass sich die Klasse vonCachingConfigurerSupport erstrecken oderCacheConfigurer implementieren muss:

@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();
    }
}

Die zweite Möglichkeit besteht darin, es nur für eine bestimmte Methode zu verwenden:

@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. Fazit

In diesem Artikel haben wir eine Möglichkeit untersucht, dieKeyGeneratoreines benutzerdefinierten Spring Cache zu implementieren.

Wie immer ist der vollständige Quellcode der Beispieleover on GitHub verfügbar.