Spring Cache - Criando um KeyGenerator personalizado
1. Visão geral
Neste tutorial rápido, ilustraremos como criar um gerador de chaves personalizado com o Spring Cache.
Para obter uma introdução ao módulo acima, consulteto this article.
2. KeyGenerator
Isso é responsável por gerar todas as chaves para cada item de dados no cache, que seriam usadas para procurar o item de dados na recuperação.
A implementação padrão aqui éSimpleKeyGenerator – which usa os parâmetros do método fornecidos para gerar uma chave. Isso significa que, se tivermos dois métodos que usam o mesmo nome de cache e conjunto de tipos de parâmetros, há uma grande probabilidade de que isso resulte em uma colisão.
Isso também implica que os dados do cache podem ser substituídos por outro método.
3. KeyGenerator personalizado
AKeyGeneratorprecisa implementar apenas um único método:
Object generate(Object object, Method method, Object... params)
Se não for implementado ou usado corretamente, pode levar à substituição dos dados do cache.
Vejamos a implementação:
public class CustomKeyGenerator implements KeyGenerator {
public Object generate(Object target, Method method, Object... params) {
return target.getClass().getSimpleName() + "_"
+ method.getName() + "_"
+ StringUtils.arrayToDelimitedString(params, "_");
}
}
Depois disso, temos duas maneiras possíveis de usá-lo; o primeiro é declarar um bean emApplicationConfig.
É importante observar que a classe deve se estender deCachingConfigurerSupport ou implementarCacheConfigurer:
@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();
}
}
A segunda maneira é usá-lo apenas para um método específico:
@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. Conclusão
Neste artigo, exploramos uma maneira de implementarKeyGenerator do Spring Cache personalizado.
Como sempre, o código-fonte completo dos exemplos está disponívelover on GitHub.