どうも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リンククリックのみ(購入不要)」で構いませんので、ポチっと応援していただけるとうれしいです。