欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringCache源碼解析Annotation案例講解

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

〇、常用注解

包地址注解名作用域作用
org.springframework.cache.annotationCacheConfig類級別s設(shè)置緩存的公共配置
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 才進行緩存。不能使用返回結(jié)果
unless不緩存的條件,可以為空,使用 SpEL 編寫,返回 true 或者 false,只有為 false才進行緩存??梢允褂梅祷亟Y(jié)果
sync
  • 簡介:表示該方法執(zhí)行后的結(jié)果可以被緩存;可作用于類和方法,作用于類上,則表示對該類的所有方法都有效;
  • 執(zhí)行邏輯:查找對應(yīng)的緩存是否存在,若不存在,該方法會被調(diào)用,并且將返回結(jié)果放入緩存;若存在,則不調(diào)用方法,直接返回緩存的結(jié)果;

1.1 案例

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

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

多個緩存名稱和條件:

@Cacheable(value = {"books", "archivedBooks"}, condition = "#id.length() > 10")
public Book findBookWithComplexKey(String id) {
    // 業(yè)務(wù)邏輯
}
@Service
public class MyService {
    /**
     * 一個使用 @Cacheable 所有屬性的案例。
     * 
     * @param id 用戶ID
     * @return 返回用戶對象
     */
    @Cacheable(
        value = "users",          // 緩存名稱
        key = "#id",              // 緩存鍵,使用SpEL表達式
        condition = "#id.length() > 3",  // 緩存條件,只有當ID長度大于3時才緩存
        unless = "#result == null" // 除非條件,如果結(jié)果為null,則不緩存
    )
    public User findUserById(String id) {
        // 模擬數(shù)據(jù)庫查詢操作,這里假設(shè)ID長度小于3時沒有結(jié)果
        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表達式,方法調(diào)用前計算,當結(jié)果為true時執(zhí)行動作
    // 默認為空,表示總是緩存方法返回值
    String condition() default "";
    // 否決緩存的條件,使用SpEL表達式,方法調(diào)用后計算(可使用result),當結(jié)果為true時不執(zhí)行動作
    // 默認為空,表示永不否決;
    String unless() default "";
    // 使用異步模式標識
    boolean sync() default false;
}

二、@CachePut

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

  • 簡介:表示該方法執(zhí)行后的結(jié)果需要更新到緩存;可作用于類和方法,作用于類上,則表示對該類的所有方法都有效;
  • 執(zhí)行邏輯:和Cacheable不同的是,帶有CachePut注解的方法一定會被執(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 用戶對象,包含ID
     * @return 更新后的用戶對象
     */
    @CachePut(
        value = "users",      // 緩存名稱
        key = "#user.id",     // 緩存鍵,使用SpEL表達式
        condition = "#user.age > 18"  // 條件,只有當用戶年齡大于18時才更新緩存
    )
    public User updateUserProfile(User user) {
        // 模擬更新用戶信息的業(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所在緩存的標識符,支持多個,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表達式,方法調(diào)用后計算(可使用result),當結(jié)果為true時執(zhí)行動作
    // 默認為空,表示方法結(jié)果總是被緩存
    String condition() default "";
    // 否決放置緩存的條件,使用SpEL表達式,方法調(diào)用后計算(可使用result),當結(jié)果為true時不執(zhí)行動作
    // 默認為空,表示永不否決;
    String unless() default "";
}

三、@CacheEvict

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

注解屬性介紹

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

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

3.1 案例

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

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

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

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

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;
    // 方法調(diào)用前執(zhí)行標識
    // 默認為false,表示方法成功調(diào)用(未拋出異常)后執(zhí)行;為true則方法調(diào)用前執(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è)務(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 注解用于在類級別提供緩存相關(guān)的共享配置。

注解屬性介紹

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

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

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的注解驅(qū)動的緩存管理能力,和@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
    // 設(shè)置為true,會影響所有需要代理的Spring管理的Bean
    boolean proxyTargetClass() default false;
    // 緩存應(yīng)用模式:Proxy or AspectJ
    // Proxy模式只允許通過代理攔截調(diào)用,不會攔截同一類中的本地調(diào)用
    // AspectJ模式下,proxyTargetClass()無效,會攔截同一類中的本地調(diào)用
    AdviceMode mode() default AdviceMode.PROXY;
    // 特定連接點應(yīng)用多個建議時,緩存操作的執(zhí)行順序
    int order() default Ordered.LOWEST_PRECEDENCE;
}

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

相關(guān)文章

  • java 中枚舉類enum的values()方法的詳解

    java 中枚舉類enum的values()方法的詳解

    這篇文章主要介紹了java 中枚舉類enum的values()方法的詳解的相關(guān)資料,希望通過本文大家能夠掌握這部分內(nèi)容,需要的朋友可以參考下
    2017-09-09
  • My eclipse 端口占用(9360)問題解決辦法

    My eclipse 端口占用(9360)問題解決辦法

    這篇文章主要介紹了My eclipse 工程發(fā)布時出現(xiàn)端口占用問題解決辦法的相關(guān)資料,需要的朋友可以參考下
    2016-12-12
  • Java編程中實現(xiàn)歸并排序算法的實例教程

    Java編程中實現(xiàn)歸并排序算法的實例教程

    這篇文章主要介紹了Java編程中實現(xiàn)歸并排序算法的實例教程,包括自底向上的歸并排序的實現(xiàn)方法介紹,需要的朋友可以參考下
    2016-05-05
  • java如何用反射將一個對象復(fù)制給另一個對象

    java如何用反射將一個對象復(fù)制給另一個對象

    這篇文章主要介紹了java如何用反射將一個對象復(fù)制給另一個對象問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • java中List集合子類特點淺析

    java中List集合子類特點淺析

    java.util.List接口繼承自Collection接口,是單列集合的一個重要分支,習慣性地會將實現(xiàn)了List接口的對象稱為List集合,下面這篇文章主要給大家介紹了關(guān)于java中List集合子類特點的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-01-01
  • 詳解Java抽象類與普通類的區(qū)別

    詳解Java抽象類與普通類的區(qū)別

    今天給大家?guī)淼氖顷P(guān)于Java的相關(guān)知識,文章圍繞著Java抽象類與普通類的區(qū)別展開,文中有非常詳細的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • 5個步驟讓你明白多線程和線程安全

    5個步驟讓你明白多線程和線程安全

    本文詳細講解了多線程和線程安全的實現(xiàn),文中通過示例代碼介紹的非常詳細。對大家的學(xué)習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-12-12
  • Flowable歷史查詢實例分析

    Flowable歷史查詢實例分析

    這篇文章主要介紹了Flowable歷史查詢實例分析,歷史是記錄流程執(zhí)行過程中發(fā)生的事情,并將其永久存儲的組件,與運行時數(shù)據(jù)不同,歷史數(shù)據(jù)在流程實例完成以后仍保存在數(shù)據(jù)庫中,下面我們來深入了解
    2023-10-10
  • SSM整合中的Log4j日志的配置詳情

    SSM整合中的Log4j日志的配置詳情

    這篇文章主要介紹了SSM整合中的Log4j的配置詳情,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • Maven腳手架如何基于jeecg實現(xiàn)快速開發(fā)

    Maven腳手架如何基于jeecg實現(xiàn)快速開發(fā)

    這篇文章主要介紹了Maven腳手架如何基于jeecg實現(xiàn)快速開發(fā),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友可以參考下
    2020-10-10

最新評論