Spring中@Cacheable注解的使用詳解
@Cacheable注解
在現(xiàn)代的應(yīng)用程序中,緩存是提高性能和可擴(kuò)展性的重要組成部分。
Spring框架提供了@Cacheable注解來(lái)輕松地將方法結(jié)果緩存起來(lái),以便在后續(xù)調(diào)用中快速訪問(wèn)。本文將詳細(xì)介紹@Cacheable注解的使用方法,并從源碼級(jí)別解析其實(shí)現(xiàn)原理。
@Cacheable注解的使用方法
@Cacheable注解可用于Spring管理的bean中的任何方法上。它可以被用來(lái)緩存方法返回的結(jié)果。當(dāng)使用@Cacheable注解時(shí),Spring會(huì)在調(diào)用方法前檢查緩存中是否已經(jīng)存在該方法的結(jié)果,如果存在,則直接返回緩存中的結(jié)果,而不會(huì)執(zhí)行方法體中的代碼。如果緩存中不存在該方法的結(jié)果,則會(huì)執(zhí)行方法體中的代碼,并將結(jié)果存儲(chǔ)到緩存中,以便下次調(diào)用該方法時(shí)可以直接返回緩存中的結(jié)果。
下面是@Cacheable注解的使用示例:
@Cacheable(value="users", key="#userId") public User getUserById(String userId) { // 查詢數(shù)據(jù)庫(kù)獲取用戶信息 }
上面的示例中,@Cacheable注解被用于getUserById方法上。其中value屬性指定了緩存的名稱為“users”,key屬性指定了緩存的鍵為傳入的userId參數(shù)。當(dāng)調(diào)用getUserById方法時(shí),Spring會(huì)先檢查名為“users”的緩存中是否已經(jīng)存在鍵為userId的結(jié)果,如果存在,則直接返回緩存中的結(jié)果,否則執(zhí)行方法體中的代碼,并將結(jié)果存儲(chǔ)到緩存中。
@Cacheable注解還可以使用SpEL表達(dá)式來(lái)動(dòng)態(tài)地計(jì)算緩存的鍵。例如:
@Cacheable(value="users", key="#user.id") public User getUserById(User user) { // 查詢數(shù)據(jù)庫(kù)獲取用戶信息 }
上面的示例中,key屬性使用了SpEL表達(dá)式“#user.id”,表示緩存的鍵為傳入?yún)?shù)user對(duì)象的id屬性值。
@Cacheable注解還支持多個(gè)鍵值對(duì)作為緩存的鍵。例如:
@Cacheable(value="users", key="#userId + '_' + #type") public User getUserByIdAndType(String userId, String type) { // 查詢數(shù)據(jù)庫(kù)獲取用戶信息 }
上面的示例中,key屬性使用了兩個(gè)參數(shù)作為鍵值對(duì),分別是userId和type。
@Cacheable注解還支持condition屬性來(lái)指定是否進(jìn)行緩存。例如:
@Cacheable(value="users", key="#userId", condition="#userId.length() < 10") public User getUserById(String userId) { // 查詢數(shù)據(jù)庫(kù)獲取用戶信息 }
上面的示例中,condition屬性使用了SpEL表達(dá)式“#userId.length() < 10”,表示只有當(dāng)傳入?yún)?shù)userId的長(zhǎng)度小于10時(shí)才進(jìn)行緩存。
@Cacheable注解還支持unless屬性來(lái)指定不進(jìn)行緩存的條件。例如:
@Cacheable(value="users", key="#userId", unless="#result == null") public User getUserById(String userId) { // 查詢數(shù)據(jù)庫(kù)獲取用戶信息 }
上面的示例中,unless屬性使用了SpEL表達(dá)式“#result == null”,表示只有當(dāng)方法返回值不為null時(shí)才進(jìn)行緩存。
@Cacheable注解源碼分析
@Cacheable注解是Spring框架中org.springframework.cache.annotation包下的一個(gè)注解。它實(shí)際上是一個(gè)組合注解,包含了@CachePut、@CacheEvict和@Caching三個(gè)注解。
當(dāng)使用@Cacheable注解時(shí),Spring會(huì)在運(yùn)行時(shí)動(dòng)態(tài)地生成一個(gè)代理對(duì)象來(lái)攔截目標(biāo)方法的調(diào)用。代理對(duì)象會(huì)首先檢查緩存中是否已經(jīng)存在該方法的結(jié)果,如果存在,則直接返回緩存中的結(jié)果,否則執(zhí)行目標(biāo)方法,并將結(jié)果存儲(chǔ)到緩存中。
下面是@Cacheable注解的源碼:
@Target({ElementType.METHOD, ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Inherited @Documented @Caching(cacheable = @Cacheable) public @interface Cacheable { Class<?>[] value() default {}; String[] cacheNames() default {}; String key() default ""; String keyGenerator() default ""; String cacheManager() default ""; String cacheResolver() default ""; String condition() default ""; String unless() default ""; boolean sync() default false; }
從源碼可以看出,@Cacheable注解包含了value、cacheNames、key、keyGenerator、cacheManager、cacheResolver、condition、unless和sync等屬性。
value和cacheNames屬性用于指定緩存名稱。
key和keyGenerator屬性用于指定緩存鍵。
cacheManager和cacheResolver屬性用于指定緩存管理器和緩存解析器。
condition和unless屬性用于指定是否進(jìn)行緩存。
sync屬性用于指定是否啟用同步模式。
總結(jié)
本文詳細(xì)介紹了@Cacheable注解的使用方法,并從源碼級(jí)別解析了其實(shí)現(xiàn)原理。
使用@Cacheable注解可以輕松地將方法結(jié)果緩存起來(lái),以提高應(yīng)用程序的性能和可擴(kuò)展性。
在實(shí)際應(yīng)用開(kāi)發(fā)中,我們可以根據(jù)具體需求靈活地配置@Cacheable注解的各種屬性來(lái)達(dá)到最佳效果。
到此這篇關(guān)于Spring中@Cacheable注解的使用詳解的文章就介紹到這了,更多相關(guān)@Cacheable注解的使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Springboot使用@Cacheable注解實(shí)現(xiàn)數(shù)據(jù)緩存
- SpringBoot使用@Cacheable出現(xiàn)預(yù)覽工具亂碼的解決方法
- Spring Cache @Cacheable 緩存在部分Service中不生效的解決辦法
- 詳解Springboot @Cacheable 注解(指定緩存位置)
- 詳解Spring數(shù)據(jù)緩存注解@Cacheable、@CachePut、@CacheEvict
- 詳解如何使用SpringBoot的緩存@Cacheable
- Spring中的@Cacheable緩存注解詳解
- SpringBoot使用@Cacheable注解實(shí)現(xiàn)緩存功能流程詳解
相關(guān)文章
SpringBoot之@Controller和@RequestMapping的實(shí)現(xiàn)原理解讀
這篇文章主要介紹了SpringBoot之@Controller和@RequestMapping的實(shí)現(xiàn)原理,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-04-04Spring之關(guān)于PropertyDescriptor的擴(kuò)展剖析
這篇文章主要介紹了Spring之關(guān)于PropertyDescriptor的擴(kuò)展剖析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07Spring中的接口重試機(jī)制spring-retry之listeners參數(shù)解析
這篇文章主要介紹了Spring中的接口重試機(jī)制spring-retry之listeners參數(shù)解析,注解@Retryable有一個(gè)參數(shù)listeners沒(méi)有說(shuō)明,那么本篇文章我們?cè)敿?xì)介紹一個(gè)這個(gè)參數(shù)的用,需要的朋友可以參考下2024-01-01手把手教你如何利用SpringBoot實(shí)現(xiàn)審核功能
審核功能經(jīng)過(guò)幾個(gè)小時(shí)的奮戰(zhàn)終于完成了,現(xiàn)在我就與廣大網(wǎng)友分享我的成果,這篇文章主要給大家介紹了關(guān)于如何利用SpringBoot實(shí)現(xiàn)審核功能的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-05-05Java實(shí)現(xiàn)冪等性校驗(yàn)的示例代碼
我們?cè)谧鰓eb應(yīng)用的時(shí)候通常會(huì)遇到前端提交按鈕重復(fù)點(diǎn)擊的場(chǎng)景,在某些新增操作上就需要做冪等性限制來(lái)保證數(shù)據(jù)的可靠性,所以本文主要介紹了如何使用java?aop實(shí)現(xiàn)冪等性校驗(yàn),需要的可以參考下2024-02-02JAVA 多態(tài)操作----父類與子類轉(zhuǎn)換問(wèn)題實(shí)例分析
這篇文章主要介紹了JAVA 多態(tài)操作----父類與子類轉(zhuǎn)換問(wèn)題,結(jié)合實(shí)例形式分析了JAVA 多態(tài)操作中父類與子類轉(zhuǎn)換問(wèn)題相關(guān)原理、操作技巧與注意事項(xiàng),需要的朋友可以參考下2020-05-05JavaWeb實(shí)現(xiàn)mysql數(shù)據(jù)庫(kù)數(shù)據(jù)的添加和刪除
這篇文章主要介紹了如何利用JavaWeb實(shí)現(xiàn)mysql數(shù)據(jù)庫(kù)數(shù)據(jù)的添加和刪除功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2022-03-03利用Java實(shí)現(xiàn)玩家打怪小游戲的完整過(guò)程
這篇文章主要介紹了如何使用Java創(chuàng)建一個(gè)簡(jiǎn)單的“打怪小游戲”,游戲中的角色分為法師、戰(zhàn)士、BOSS和一個(gè)Team類,代碼展示了如何通過(guò)面向?qū)ο缶幊虂?lái)實(shí)現(xiàn)一個(gè)基本的戰(zhàn)斗系統(tǒng),需要的朋友可以參考下2024-12-12