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

SpringCache源碼解析Annotation案例講解

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

〇、常用注解

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

一、@Cacheable注解

屬性默認值描述
value緩存的名稱,在 spring 配置文件中定義,必須指定至少一個
cacheNames緩存的名稱,在 spring 配置文件中定義,必須指定至少一個
key緩存的 key,可以為空,如果指定要按照 SpEL 表達式編寫,如果不指定,則缺省按照方法的所有參數(shù)進行組合
keyGenerator
cacheManager
cacheResolver
condition緩存的條件,可以為空,使用 SpEL 編寫,返回 true 或者 false,只有為 true 才進行緩存。不能使用返回結果
unless不緩存的條件,可以為空,使用 SpEL 編寫,返回 true 或者 false,只有為 false才進行緩存??梢允褂梅祷亟Y果
sync
  • 簡介:表示該方法執(zhí)行后的結果可以被緩存;可作用于類和方法,作用于類上,則表示對該類的所有方法都有效;
  • 執(zhí)行邏輯:查找對應的緩存是否存在,若不存在,該方法會被調用,并且將返回結果放入緩存;若存在,則不調用方法,直接返回緩存的結果;

1.1 案例

注解業(yè)務案例 單一緩存名稱和鍵:

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

多個緩存名稱和條件:

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

1.2 核心源碼

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

二、@CachePut

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

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

2.1 案例

@CachePut("books")
public Book updateBookDetails(String id, Book details) {
    // 業(yè)務邏輯
}
@Service
public class MyService {
    /**
     * 使用 @CachePut 所有屬性的案例。
     *
     * @param user 用戶對象,包含ID
     * @return 更新后的用戶對象
     */
    @CachePut(
        value = "users",      // 緩存名稱
        key = "#user.id",     // 緩存鍵,使用SpEL表達式
        condition = "#user.age > 18"  // 條件,只有當用戶年齡大于18時才更新緩存
    )
    public User updateUserProfile(User user) {
        // 模擬更新用戶信息的業(yè)務邏輯
        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所在緩存的標識符,支持多個,CSV格式
    @AliasFor("cacheNames")
    String[] value() default {};
    // 緩存KEY所在緩存的標識符,支持多個,CSV格式
    @AliasFor("value")
    String[] cacheNames() default {};
    // 緩存的KEY,可以為空(缺省按照方法的所有參數(shù)組合生成SimpleKey);
    // 支持SpEL表達式
    String key() default "";
    // KEY的生成器
    String keyGenerator() default "";
    // 緩存管理器
    String cacheManager() default "";
    // 緩存解析器
    String cacheResolver() default "";
    // 放置緩存的條件,使用SpEL表達式,方法調用后計算(可使用result),當結果為true時執(zhí)行動作
    // 默認為空,表示方法結果總是被緩存
    String condition() default "";
    // 否決放置緩存的條件,使用SpEL表達式,方法調用后計算(可使用result),當結果為true時不執(zhí)行動作
    // 默認為空,表示永不否決;
    String unless() default "";
}

三、@CacheEvict

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

注解屬性介紹

  • value 或 cacheNames: 指定緩存名稱,可以是單個或多個;
  • allEntries: 清除所有緩存項;
  • condition: 指定清除緩存的條件SpEL表達式;

簡介:表示清除該方法的緩存KEY對應的緩存;可作用于類和方法,作用于類上,則表示對該類的所有方法都有效;

3.1 案例

清除特定緩存名稱的條目:

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

清除所有緩存名稱的所有條目:

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

3.2 核心源碼

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

四、@Caching(不常用)

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

注解屬性介紹

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

4.1 案例

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

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 注解用于在類級別提供緩存相關的共享配置。

注解屬性介紹

  • cacheNames: 指定類中所有緩存操作的默認緩存名稱;
  • keyGenerator: 指定默認的緩存鍵生成器;
  • condition: 指定類中所有緩存操作的默認條件;
  • 簡介:提供在類層次上共享緩存相關配置的機制;只可作用于類上;

當作用在某個類上,會給這個類中定義的所有緩存動作提供默認配置,當然,具體緩存動作的配置可覆蓋提供的默認配置;

5.1 案例

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

5.2 核心源碼

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

六、@EnableCaching

簡介:
表示啟用Spring的注解驅動的緩存管理能力,和@Configuration配合使用;

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

6.1 核心源碼

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

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

相關文章

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

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

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

    Java?MyBatis之Mapper代理詳解

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

    Maven項目啟動報錯error in opening zip file的解決方

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

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

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

    在Mac OS上安裝Tomcat服務器的教程

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

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

    這篇文章主要給大家介紹了關于Java發(fā)起http請求的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-02-02
  • Spring事務隔離級別簡介及實例解析

    Spring事務隔離級別簡介及實例解析

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

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

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

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

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

    java對象類型轉換和多態(tài)性(實例講解)

    下面小編就為大家?guī)硪黄猨ava對象類型轉換和多態(tài)性(實例講解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10

最新評論

武宁县| 义乌市| 玛多县| 炉霍县| 苏州市| 南乐县| 连云港市| 永登县| 汉源县| 泉州市| 获嘉县| 苍南县| 温宿县| 峨山| 龙山县| 泗洪县| 大冶市| 台南市| 丘北县| 高邮市| 澄江县| 准格尔旗| 陇西县| 赣榆县| 洪洞县| 望奎县| 临夏市| 哈密市| 临澧县| 伊吾县| 抚宁县| 东丰县| 涞源县| 敖汉旗| 红桥区| 高台县| 梁河县| 馆陶县| 壤塘县| 大洼县| 陇川县|