Spring Cache - カスタムKeyGeneratorの作成

1.概要

このクイックチュートリアルでは、Spring Cacheを使用してカスタムキージェネレータを作成する方法を説明します。

上記のモジュールの紹介については、 この記事へ を参照してください。

2. KeyGenerator

これは、キャッシュ内の各データ項目のすべてのキーを生成する責任があります。これは、検索時にデータ項目をルックアップするために使用されます。

ここでのデフォルトの実装は __SimpleKeyGeneratorです - __whichはキーを生成するために提供されたメソッドパラメータを使用します。つまり、同じキャッシュ名と一連のパラメータタイプを使用する2つのメソッドがあると、衝突が発生する可能性が高いということです。

また、キャッシュデータが別の方法で上書きされる可能性があることも意味します。

3.カスタム KeyGenerator

__KeyGenerator __はひとつのメソッドを実装する必要があります。

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

正しく実装または使用されていないと、キャッシュデータが上書きされる可能性があります。

実装を見てみましょう。

public class CustomKeyGenerator implements KeyGenerator {

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

それ以降は、2通りの使い方があります。 1つ目は ApplicationConfig でBeanを宣言することです。

クラスは CachingConfigurerSupport から継承するか、または CacheConfigurer を実装する必要があることに注意することが重要です。

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

2番目の方法は、それを特定のメソッドにだけ使用することです。

@Component
public class BookService {

    @Cacheable(value = "books", keyGenerator = "customKeyGenerator")
    public List<Book> getBooks() {
        List<Book> 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.まとめ

この記事では、カスタムSpring Cacheの KeyGenerator を実装する方法について説明しました。

いつものように、例の完全なソースコードはhttps://github.com/eugenp/tutorials/tree/master/spring-all[GitHubに載っています]にあります。