Spring Framework @Cacheableで引数無しの関数を複数定義する方法

どうもSuです。

最近、TypescriptよりもJavaを触ることの方が多いです。

Javaと言っても、Spring Frameworkを使うので、アノテーションの使い方などを学びながら開発している感じですね。

今回は、@Cacheableを使ったキャッシュ機能で、

「引数無しのキャッシュ付き関数を複数定義する場合、どういうふうに書くの?」

について解説したいと思います。

@Cacheableとは?

関数に@Cacheableをつけることで、その関数の呼び出し結果をキャッシュします。例えば、以下の場合は商品一覧を取る関数(getItems)をキャッシュし、DBアクセスの頻度を減らしています。

@Service
class ItemService(
    @Autowired private val itemRepository: ItemRepository
) {

    @Cacheable("getItems")
    public getItems(): List<Item> = itemRepository.findAll()
}

@Cacheableで引数無しのキャッシュ付き関数を複数定義する方法は?

結論は、「key = “#root.methodName”」をアノテーションの属性に付けるだけです。

@Service
class ItemService(
    @Autowired private val itemRepository: ItemRepository
    @Autowired private val itemTypeRepository: ItemTypeRepository
) {

    @Cacheable(key = "#root.methodName")
    public getItems(): List<Item> = itemRepository.findAll()

    @Cacheable(key = "#root.methodName")
    public getItemTypes(): List<ItemType> = itemTypeRepository.findAll()
}

key = “#root.methodName”ってどういう意味?

デフォルトの動きでは、キャッシュ機能は、「関数のパラメータを使ってキャッシュキーを生成する」ことになります。しかし、引数がない場合はキー生成の元となるパラメータないため、引数がない関数はお互いに同じキャッシュキーとみなされてしまうわけです。

そこで登場するのが「#root.methodName」です。

「#root」で、このクラスを参照できます。「.methodName」で呼び出された関数名を参照できます。

結果「#root.methodName」は、「関数名ごとにキャッシュキーを生成する」という意味になります。

最後に

@Cacheableは非常に便利な機能です、DB周りのアクセスをサクッとキャッシュ化できてパフォーマンス向上に期待が持てますので、使いこなしていきたいですね。

この記事が役に立ったと思って頂けた方は、「Amazonリンククリックのみ(購入不要)」で構いませんので、ポチっと応援していただけるとうれしいです。

最新情報をチェックしよう!