最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringCache源碼解析Annotation案例講解

 更新時(shí)間:2024年08月29日 09:51:11   作者:錢(qián)多多_qdd  
這篇文章主要介紹了SpringCache源碼解析Annotation的相關(guān)知識(shí),本文通過(guò)案例講解的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧

〇、常用注解

包地址注解名作用域作用
org.springframework.cache.annotationCacheConfig類(lèi)級(jí)別s設(shè)置緩存的公共配置
Cacheable方法級(jí)別緩存讀取操作
CacheEvict方法級(jí)別緩存失效操作
CachePut方法級(jí)別緩存更新操作
Caching方法級(jí)別h混合讀取、失效、更新操作
CacheConfig方法級(jí)別統(tǒng)一配置緩存注解的屬性,作用于類(lèi)
EnableCaching方法級(jí)別開(kāi)啟緩存功能

一、@Cacheable注解

屬性默認(rèn)值描述
value緩存的名稱(chēng),在 spring 配置文件中定義,必須指定至少一個(gè)
cacheNames緩存的名稱(chēng),在 spring 配置文件中定義,必須指定至少一個(gè)
key緩存的 key,可以為空,如果指定要按照 SpEL 表達(dá)式編寫(xiě),如果不指定,則缺省按照方法的所有參數(shù)進(jìn)行組合
keyGenerator
cacheManager
cacheResolver
condition緩存的條件,可以為空,使用 SpEL 編寫(xiě),返回 true 或者 false,只有為 true 才進(jìn)行緩存。不能使用返回結(jié)果
unless不緩存的條件,可以為空,使用 SpEL 編寫(xiě),返回 true 或者 false,只有為 false才進(jìn)行緩存。可以使用返回結(jié)果
sync
  • 簡(jiǎn)介:表示該方法執(zhí)行后的結(jié)果可以被緩存;可作用于類(lèi)和方法,作用于類(lèi)上,則表示對(duì)該類(lèi)的所有方法都有效;
  • 執(zhí)行邏輯:查找對(duì)應(yīng)的緩存是否存在,若不存在,該方法會(huì)被調(diào)用,并且將返回結(jié)果放入緩存;若存在,則不調(diào)用方法,直接返回緩存的結(jié)果;

1.1 案例

注解業(yè)務(wù)案例 單一緩存名稱(chēng)和鍵:

@Cacheable("books")
public Book findBookById(String id) {
    // 業(yè)務(wù)邏輯
}

多個(gè)緩存名稱(chēng)和條件:

@Cacheable(value = {"books", "archivedBooks"}, condition = "#id.length() > 10")
public Book findBookWithComplexKey(String id) {
    // 業(yè)務(wù)邏輯
}
@Service
public class MyService {
    /**
     * 一個(gè)使用 @Cacheable 所有屬性的案例。
     * 
     * @param id 用戶(hù)ID
     * @return 返回用戶(hù)對(duì)象
     */
    @Cacheable(
        value = "users",          // 緩存名稱(chēng)
        key = "#id",              // 緩存鍵,使用SpEL表達(dá)式
        condition = "#id.length() > 3",  // 緩存條件,只有當(dāng)ID長(zhǎng)度大于3時(shí)才緩存
        unless = "#result == null" // 除非條件,如果結(jié)果為null,則不緩存
    )
    public User findUserById(String id) {
        // 模擬數(shù)據(jù)庫(kù)查詢(xún)操作,這里假設(shè)ID長(zhǎng)度小于3時(shí)沒(méi)有結(jié)果
        if (id == null || id.length() <= 3) {
            return null;
        }
        return performDatabaseQuery(id);
    }
    private User performDatabaseQuery(String id) {
        // 模擬數(shù)據(jù)庫(kù)查詢(xún)邏輯
        return new User(id, "Name based on ID");
    }
}

1.2 核心源碼

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Cacheable {
    // 緩存KEY所在緩存的標(biāo)識(shí)符,支持多個(gè),CSV格式
    @AliasFor("cacheNames")
    String[] value() default {};
    // 緩存KEY所在緩存的標(biāo)識(shí)符,支持多個(gè),CSV格式
    @AliasFor("value")
    String[] cacheNames() default {};
    // 緩存的KEY,支持SpEL表達(dá)式動(dòng)態(tài)計(jì)算
    // 默認(rèn)為空(缺省按照方法的所有參數(shù)組合生成SimpleKey)
    String key() default "";
    // 緩存KEY生成器
    String keyGenerator() default "";
    // 緩存管理器
    String cacheManager() default "";
    // 緩存解析器
    String cacheResolver() default "";
    // 緩存的條件,使用SpEL表達(dá)式,方法調(diào)用前計(jì)算,當(dāng)結(jié)果為true時(shí)執(zhí)行動(dòng)作
    // 默認(rèn)為空,表示總是緩存方法返回值
    String condition() default "";
    // 否決緩存的條件,使用SpEL表達(dá)式,方法調(diào)用后計(jì)算(可使用result),當(dāng)結(jié)果為true時(shí)不執(zhí)行動(dòng)作
    // 默認(rèn)為空,表示永不否決;
    String unless() default "";
    // 使用異步模式標(biāo)識(shí)
    boolean sync() default false;
}

二、@CachePut

注解作用:@CachePut 注解用于在方法執(zhí)行后更新緩存。
注解屬性:與@Cacheable相同。

  • 簡(jiǎn)介:表示該方法執(zhí)行后的結(jié)果需要更新到緩存;可作用于類(lèi)和方法,作用于類(lèi)上,則表示對(duì)該類(lèi)的所有方法都有效;
  • 執(zhí)行邏輯:和Cacheable不同的是,帶有CachePut注解的方法一定會(huì)被執(zhí)行,方法執(zhí)行后的結(jié)果由condition/unless判定是否存入緩存;

2.1 案例

@CachePut("books")
public Book updateBookDetails(String id, Book details) {
    // 業(yè)務(wù)邏輯
}
@Service
public class MyService {
    /**
     * 使用 @CachePut 所有屬性的案例。
     *
     * @param user 用戶(hù)對(duì)象,包含ID
     * @return 更新后的用戶(hù)對(duì)象
     */
    @CachePut(
        value = "users",      // 緩存名稱(chēng)
        key = "#user.id",     // 緩存鍵,使用SpEL表達(dá)式
        condition = "#user.age > 18"  // 條件,只有當(dāng)用戶(hù)年齡大于18時(shí)才更新緩存
    )
    public User updateUserProfile(User user) {
        // 模擬更新用戶(hù)信息的業(yè)務(wù)邏輯
        return performUpdate(user);
    }
    private User performUpdate(User user) {
        // 模擬更新邏輯
        user.setName("Updated Name");
        return user;
    }
}

2.2 核心源碼

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface CachePut {
    // 緩存KEY所在緩存的標(biāo)識(shí)符,支持多個(gè),CSV格式
    @AliasFor("cacheNames")
    String[] value() default {};
    // 緩存KEY所在緩存的標(biāo)識(shí)符,支持多個(gè),CSV格式
    @AliasFor("value")
    String[] cacheNames() default {};
    // 緩存的KEY,可以為空(缺省按照方法的所有參數(shù)組合生成SimpleKey);
    // 支持SpEL表達(dá)式
    String key() default "";
    // KEY的生成器
    String keyGenerator() default "";
    // 緩存管理器
    String cacheManager() default "";
    // 緩存解析器
    String cacheResolver() default "";
    // 放置緩存的條件,使用SpEL表達(dá)式,方法調(diào)用后計(jì)算(可使用result),當(dāng)結(jié)果為true時(shí)執(zhí)行動(dòng)作
    // 默認(rèn)為空,表示方法結(jié)果總是被緩存
    String condition() default "";
    // 否決放置緩存的條件,使用SpEL表達(dá)式,方法調(diào)用后計(jì)算(可使用result),當(dāng)結(jié)果為true時(shí)不執(zhí)行動(dòng)作
    // 默認(rèn)為空,表示永不否決;
    String unless() default "";
}

三、@CacheEvict

注解作用:@CacheEvict 注解用于在方法執(zhí)行后清除緩存。

注解屬性介紹

  • value 或 cacheNames: 指定緩存名稱(chēng),可以是單個(gè)或多個(gè);
  • allEntries: 清除所有緩存項(xiàng);
  • condition: 指定清除緩存的條件SpEL表達(dá)式;

簡(jiǎn)介:表示清除該方法的緩存KEY對(duì)應(yīng)的緩存;可作用于類(lèi)和方法,作用于類(lèi)上,則表示對(duì)該類(lèi)的所有方法都有效;

3.1 案例

清除特定緩存名稱(chēng)的條目:

@CacheEvict("books")
public void deleteBook(String id) {
    // 業(yè)務(wù)邏輯
}

清除所有緩存名稱(chēng)的所有條目:

@CacheEvict(allEntries = true)
public void clearAllCaches() {
    // 業(yè)務(wù)邏輯
}

3.2 核心源碼

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface CacheEvict {
    // 緩存KEY所在緩存的標(biāo)識(shí)符,支持多個(gè),CSV格式
    @AliasFor("cacheNames")
    String[] value() default {};
    // 緩存KEY所在緩存的標(biāo)識(shí)符,支持多個(gè),CSV格式
    @AliasFor("value")
    String[] cacheNames() default {};
    // 緩存的KEY,可以為空(缺省按照方法的所有參數(shù)組合生成SimpleKey);
    // 支持SpEL表達(dá)式
    String key() default "";
    // KEY的生成器
    String keyGenerator() default "";
    // 緩存管理器
    String cacheManager() default "";
    // 緩存解析器
    String cacheResolver() default "";
    // 清除緩存的條件,使用SpEL表達(dá)式,執(zhí)行次序由beforeInvocation()決定
    // 默認(rèn)為空,表示總是清除緩存
    String condition() default "";
    // 刪除緩存中所有條目標(biāo)識(shí)
    // 默認(rèn)為false,表示只刪除指定KEY的值
    boolean allEntries() default false;
    // 方法調(diào)用前執(zhí)行標(biāo)識(shí)
    // 默認(rèn)為false,表示方法成功調(diào)用(未拋出異常)后執(zhí)行;為true則方法調(diào)用前執(zhí)行
    boolean beforeInvocation() default false;
}

四、@Caching(不常用)

注解作用:@Caching 注解用于組合多個(gè)緩存操作。

注解屬性介紹

  • value: 包含多個(gè)緩存操作的數(shù)組;
  • 簡(jiǎn)介:表示多個(gè)Cache注解的組注解;可作用于類(lèi)和方法,作用于類(lèi)上,則表示對(duì)該類(lèi)的所有方法都有效;

4.1 案例

@Caching(
    cacheable = {@Cacheable("books")},
    put = {@CachePut("books")},
    evict = {@CacheEvict("archivedBooks")}
)
public Book processBook(String id, Book details) {
    // 業(yè)務(wù)邏輯
}

4.2 核心源碼

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Caching {
    // Cacheable集合
     Cacheable[] cacheable() default {};
    // CachePut集合
     CachePut[] put() default {};
    // CacheEvict集合
     CacheEvict[] evict() default {};
}

五、@CacheConfig

注解作用:@CacheConfig 注解用于在類(lèi)級(jí)別提供緩存相關(guān)的共享配置。

注解屬性介紹

  • cacheNames: 指定類(lèi)中所有緩存操作的默認(rèn)緩存名稱(chēng);
  • keyGenerator: 指定默認(rèn)的緩存鍵生成器;
  • condition: 指定類(lèi)中所有緩存操作的默認(rèn)條件;
  • 簡(jiǎn)介:提供在類(lèi)層次上共享緩存相關(guān)配置的機(jī)制;只可作用于類(lèi)上;

當(dāng)作用在某個(gè)類(lèi)上,會(huì)給這個(gè)類(lèi)中定義的所有緩存動(dòng)作提供默認(rèn)配置,當(dāng)然,具體緩存動(dòng)作的配置可覆蓋提供的默認(rèn)配置;

5.1 案例

@CacheConfig(cacheNames = "books", keyGenerator = "customKeyGenerator")
public class BookService {
    // 類(lèi)中的方法可以使用緩存注解
}

5.2 核心源碼

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface CacheConfig {
    // 緩存KEY所在緩存的標(biāo)識(shí)符,支持多個(gè),CSV格式
    String[] cacheNames() default {};
    // KEY的生成器
    String keyGenerator() default "";
    // 緩存管理器
    String cacheManager() default "";
    // 緩存解析器
    String cacheResolver() default "";
}

六、@EnableCaching

簡(jiǎn)介:
表示啟用Spring的注解驅(qū)動(dòng)的緩存管理能力,和@Configuration配合使用;

必須創(chuàng)建CacheManager Bean,Spring框架不會(huì)提供默認(rèn)值;@EnableCaching會(huì)根據(jù)類(lèi)型搜索CacheManager Bean,因此CacheManager Bean的命名并不重要;
可以實(shí)現(xiàn)CachingConfigurer接口的cacheManager()方法來(lái)創(chuàng)建@EnableCaching指定的CacheManager Bean,這種情況下需要明確提供KeyGenerator(@EnableCaching會(huì)默認(rèn)提供SimpleKeyGenerator);如果不需要自定義,可以考慮從CachingConfigurerSupport擴(kuò)展,它為所有方法提供了默認(rèn)實(shí)現(xiàn);

6.1 核心源碼

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(CachingConfigurationSelector.class)
public @interface EnableCaching {
    // 代理模式:CGLIB or JDK Interface
    // 默認(rèn)為false,表示基于JDK Interface
    // 設(shè)置為true,會(huì)影響所有需要代理的Spring管理的Bean
    boolean proxyTargetClass() default false;
    // 緩存應(yīng)用模式:Proxy or AspectJ
    // Proxy模式只允許通過(guò)代理攔截調(diào)用,不會(huì)攔截同一類(lèi)中的本地調(diào)用
    // AspectJ模式下,proxyTargetClass()無(wú)效,會(huì)攔截同一類(lèi)中的本地調(diào)用
    AdviceMode mode() default AdviceMode.PROXY;
    // 特定連接點(diǎn)應(yīng)用多個(gè)建議時(shí),緩存操作的執(zhí)行順序
    int order() default Ordered.LOWEST_PRECEDENCE;
}

到此這篇關(guān)于SpringCache源碼解析Annotation案例講解的文章就介紹到這了,更多相關(guān)SpringCache Annotation內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • JAVA中堆、棧,靜態(tài)方法和非靜態(tài)方法的速度問(wèn)題

    JAVA中堆、棧,靜態(tài)方法和非靜態(tài)方法的速度問(wèn)題

    這篇文章主要介紹了JAVA中堆、棧,靜態(tài)方法和非靜態(tài)方法的速度問(wèn)題,堆和棧得速度性能分析多角度給大家分析,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-08-08
  • Java?MyBatis之Mapper代理詳解

    Java?MyBatis之Mapper代理詳解

    這篇文章主要介紹了Java?web中MyBatis的mapper代理,文中有詳細(xì)的代碼示例,具有一定的參考價(jià)值,感興趣的小伙伴可以參考一下
    2023-04-04
  • Maven項(xiàng)目啟動(dòng)報(bào)錯(cuò)error in opening zip file的解決方案

    Maven項(xiàng)目啟動(dòng)報(bào)錯(cuò)error in opening zip file的解決方

    這篇文章主要介紹了Maven項(xiàng)目啟動(dòng)時(shí)常見(jiàn)的`errorinopeningzipfile`錯(cuò)誤,分析了其根本原因在于JAR文件損壞,文章提供了多種解決方法,包括刪除損壞的JAR文件、清理本地倉(cāng)庫(kù)、檢查磁盤(pán)錯(cuò)誤、手動(dòng)下載等,需要的朋友可以參考下
    2025-10-10
  • 使用React和Java實(shí)現(xiàn)文本摘要小工具

    使用React和Java實(shí)現(xiàn)文本摘要小工具

    本文將詳細(xì)介紹如何使用 React 和 Java 搭建一個(gè)小型文本摘要工具,并基于 Hugging Face 提供的 API 來(lái)實(shí)現(xiàn)智能摘要功能,感興趣的可以了解下
    2024-11-11
  • 在Mac OS上安裝Tomcat服務(wù)器的教程

    在Mac OS上安裝Tomcat服務(wù)器的教程

    這篇文章主要介紹了在Mac OS上安裝Tomcat服務(wù)器的教程,方便進(jìn)行工作環(huán)境下的Java web開(kāi)發(fā),需要的朋友可以參考下
    2015-11-11
  • Java發(fā)起http請(qǐng)求的完整步驟記錄

    Java發(fā)起http請(qǐng)求的完整步驟記錄

    這篇文章主要給大家介紹了關(guān)于Java發(fā)起http請(qǐng)求的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • Spring事務(wù)隔離級(jí)別簡(jiǎn)介及實(shí)例解析

    Spring事務(wù)隔離級(jí)別簡(jiǎn)介及實(shí)例解析

    這篇文章主要介紹了Spring事務(wù)隔離級(jí)別簡(jiǎn)介及實(shí)例解析,分享了相關(guān)代碼示例,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-02-02
  • nacos實(shí)現(xiàn)配置多個(gè)配置文件(共享配置)

    nacos實(shí)現(xiàn)配置多個(gè)配置文件(共享配置)

    文章介紹了在Spring Cloud Nacos中配置共享配置文件和擴(kuò)展配置文件的方法,包括使用`shared-configs`和`extension-configs`屬性,并詳細(xì)解釋了這些屬性的使用方式和區(qū)別,文章還提到舊版本的配置方式已經(jīng)被棄用,建議使用新的配置方式
    2026-03-03
  • 使用hibernate和struts2實(shí)現(xiàn)分頁(yè)功能的示例

    使用hibernate和struts2實(shí)現(xiàn)分頁(yè)功能的示例

    本篇文章主要介紹了使用hibernate和struts2實(shí)現(xiàn)分頁(yè)功能,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-01-01
  • java對(duì)象類(lèi)型轉(zhuǎn)換和多態(tài)性(實(shí)例講解)

    java對(duì)象類(lèi)型轉(zhuǎn)換和多態(tài)性(實(shí)例講解)

    下面小編就為大家?guī)?lái)一篇java對(duì)象類(lèi)型轉(zhuǎn)換和多態(tài)性(實(shí)例講解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-10-10

最新評(píng)論

宁城县| 龙陵县| 荣成市| 醴陵市| 延寿县| 新巴尔虎右旗| 福海县| 宁明县| 淮南市| 沽源县| 博白县| 海兴县| 四川省| 登封市| 武定县| 景谷| 宁乡县| 滨州市| 石棉县| 邵阳市| 南通市| 烟台市| 陇川县| 郁南县| 洪雅县| 合水县| 庆城县| 汉川市| 达州市| 木兰县| 阜康市| 石渠县| 明水县| 乡宁县| 临猗县| 繁峙县| 屯昌县| 石屏县| 阿鲁科尔沁旗| 理塘县| 南涧|