Spring : 緩存相關注解@EnableCaching、@CacheConfig、@Cacheable、@Caching

1.美圖

在這裏插入圖片描述

2.概述

緩存相關注解 解釋
@EnableCaching 開啓緩存註解的支持
@CacheConfig 用於統一制定一些配置參數,這樣在其他緩存註解裏面就不用重複指定
@Cacheable 如果之前已經有緩存數據值直接返回緩存數據,否則執行方法,緩存方法的返回結果
@CachePut 能夠根據方法的請求參數對其結果進行緩存,和 @Cacheable 不同的是,它每次都會觸發真實方法的調用
@CacheEvict 能夠根據一定的條件對緩存進行清空
@Caching 組合多個Cache註解的使用

3.@EnableCaching

@Target(ElementType.TYPE) // 該註解一般用於添加類上
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(CachingConfigurationSelector.class)
public @interface EnableCaching {

    /**
     * 當AdviceModemode爲PROXY時,選擇代理是基於接口實現還是cglib實現
     */
    boolean proxyTargetClass() default false;

    /**
     * 代理方式是由JDK實現還是AspectJ實現
     */
    AdviceMode mode() default AdviceMode.PROXY;

    /**
     *
     * 指示AsyncAnnotationBeanPostProcessors的順序
     * 默認值是 Ordered.LOWEST_PRECEDENCE,爲了在所有其他後處理器之後運行
     */
    int order() default Ordered.LOWEST_PRECEDENCE;

}

@EnableCaching註解用於開啓緩存的支持,只有開啓了緩存的支持,纔有後續的@Cacheable、@Caching、@CacheEvict、@CachePut、@CacheConfig的使用。

4.@CacheConfig

@Target(ElementType.TYPE) // 該註解常用於添加在類上
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface CacheConfig {

    /**
     * 緩存的名稱,必須至少指定一個,我們可以簡單的認爲是命名空間。我們一般用項目的名字
     */
    String[] cacheNames() default {};

    /**
     * key生成器,可以實現 org.springframework.cache.interceptor.KeyGenerator接口,來規定想要保存的key的格式
     * 設置自定義的key生成器實現類對應Bean的名字
     */
    String keyGenerator() default "";

    /**
     * 緩存管理器,我們可以實現CacheManager接口來實現緩存管理器
     * 指定自定義的緩存管理器對應的Bean名稱
     */
    String cacheManager() default "";

    /**
     * Cache解析器,用於根據實際情況來動態解析使用哪個Cache,實現CacheResolver接口
     * 指定自定義的Cache解析器對應的Bean名稱
     */
    String cacheResolver() default "";

}

當我們需要緩存的地方越來越多,這個時候我們可以使用@CacheConfig註解來統一制定一些參數。這樣在@Cacheable、@CachePut等這些註解上就可以不用重複去填這些參數了。

5.@Cacheable

@Target({ElementType.METHOD, ElementType.TYPE}) // 該註解用於添加在方法或者類上
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Cacheable {

    /**
     * 緩存的名稱,必須至少指定一個,緩存的名稱,必須至少指定一個,我們可以簡單的認爲是命名空間。我們一般用項目的名字
     */
    @AliasFor("cacheNames")
    String[] value() default {};
    @AliasFor("value")
    String[] cacheNames() default {};

    /**
     * 緩存的key
     */
    String key() default "";

    /**
     * key生成器,可以實現 org.springframework.cache.interceptor.KeyGenerator接口,來規定想要保存的key的格式
     * 設置自定義的key生成器實現類對應Bean的名字
     */
    String keyGenerator() default "";

    /**
     * 緩存管理器,我們可以實現CacheManager接口來實現緩存管理器
     * 指定自定義的緩存管理器對應的Bean名稱
     */
    String cacheManager() default "";

    /**
     * Cache解析器,用於根據實際情況來動態解析使用哪個Cache,實現CacheResolver接口
     * 指定自定義的Cache解析器對應的Bean名稱
     */
    String cacheResolver() default "";

    /**
     * 緩存的條件
     */
    String condition() default "";

    /**
     * 否定緩存。當條件結果爲TRUE時,就不會緩存
     * @Cacheable(value=”testcache”,unless=”#userName.length()>2”)
     */
    String unless() default "";

    /**
     * 是否使用異步模式
     */
    boolean sync() default false;

}

@Cacheable註解會先查詢是否已經有緩存,有會使用緩存,沒有則會執行方法並緩存。

6.@CachePut

@Target({ElementType.METHOD, ElementType.TYPE}) // 添加在類或者方法上
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface CachePut {

    /**
     * 緩存的名稱,必須至少指定一個,我們可以簡單的認爲是命名空間。我們一般用項目的名字
     */
    @AliasFor("cacheNames")
    String[] value() default {};
    @AliasFor("value")
    String[] cacheNames() default {};

    /**
     * 緩存的key
     */
    String key() default "";

    /**
     * key生成器,可以實現 org.springframework.cache.interceptor.KeyGenerator接口,來規定想要保存的key的格式
     * 設置自定義的key生成器實現類對應Bean的名字
     */
    String keyGenerator() default "";

    /**
     * 緩存管理器,我們可以實現CacheManager接口來實現緩存管理器
     * 指定自定義的緩存管理器對應的Bean名稱
     */
    String cacheManager() default "";

    /**
     * Cache解析器,用於根據實際情況來動態解析使用哪個Cache,實現CacheResolver接口
     * 指定自定義的Cache解析器對應的Bean名稱
     */
    String cacheResolver() default "";

    /**
     * 緩存的條件
     */
    String condition() default "";

    /**
     * 否定緩存。當條件結果爲TRUE時,就不會緩存
     * @Cacheable(value=”testcache”,unless=”#userName.length()>2”)
     */
    String unless() default "";

}

@CachePut註解的作用主要針對方法配置,能夠根據方法的請求參數對其結果進行緩存,和@Cacheable不同的是,它每次都會觸發真實方法的調用 。簡單來說就是用戶更新緩存數據。但需要注意的是該註解的valuekey 必須與要更新的緩存相同,也就是與@Cacheable相同。

7.@CacheEvict

@Target({ElementType.METHOD, ElementType.TYPE}) // 添加在類或者方法上
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface CacheEvict {

    /**
     * 緩存的名稱,必須至少指定一個,我們可以簡單的認爲是命名空間。我們一般用項目的名字
     */
    @AliasFor("cacheNames")
    String[] value() default {};
    @AliasFor("value")
    String[] cacheNames() default {};

    /**
     * 緩存的key
     */
    String key() default "";

    /**
     * key生成器,可以實現 org.springframework.cache.interceptor.KeyGenerator接口,來規定想要保存的key的格式
     * 設置自定義的key生成器實現類對應Bean的名字
     */
    String keyGenerator() default "";

    /**
     * 緩存管理器,我們可以實現CacheManager接口來實現緩存管理器
     * 指定自定義的緩存管理器對應的Bean名稱
     */
    String cacheManager() default "";

    /**
     * Cache解析器,用於根據實際情況來動態解析使用哪個Cache,實現CacheResolver接口
     * 指定自定義的Cache解析器對應的Bean名稱
     */
    String cacheResolver() default "";

    /**
     * 緩存的條件
     */
    String condition() default "";

    /**
     * 是否清空所有緩存內容,缺省爲 false,如果指定爲 true,則方法調用後將立即清空所有緩存
     */
    boolean allEntries() default false;

    /**
     * 是否在方法執行前就清空,缺省爲 false,
     * 如果指定爲 true,則在方法還沒有執行的時候就清空緩存,缺省情況下,如果方法執行拋出異常,則不會清空緩存
     */
    boolean beforeInvocation() default false;

}

@CacheEvict能夠根據一定的條件對緩存進行清空。

8.@Caching

@Target({ElementType.METHOD, ElementType.TYPE}) // 添加在類或者方法上
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Caching {

    Cacheable[] cacheable() default {};

    CachePut[] put() default {};

    CacheEvict[] evict() default {};

}

@Caching用於組合多個Cache註解的使用。相當於在一個方法上面添加多個註解。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章