1. 程式人生 > >Spring Cache 之 快取註解使用

Spring Cache 之 快取註解使用

前言

SpringCache是SpringFramework3.1引入的新特性,提供了基於註解的快取配置方法.SpringCache是SpringFramework3.1引入的新特性,提供了基於註解的快取配置方法

pom檔案引入
<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-context</artifactId>
</dependency>
chching配置
@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport {

    /**
     *快取管理器.
     *@param redisTemplate
     *@return
     */
    @Bean
    public CacheManager cacheManager(RedisTemplate<?,?>redisTemplate) {
        RedisCacheManager cacheManager = new RedisCacheManager(redisTemplate);
        cacheManager.setDefaultExpiration(3600);
        return cacheManager;
    }


    /**
     *自定義key.
     *此方法將會根據類名+方法名+所有引數的值生成唯一的一個key,即使@Cacheable中的value屬性一樣,key也會不一樣。
     */
    @Override
    public KeyGenerator keyGenerator() {
        System.out.println("RedisCacheConfig.keyGenerator()");
        return new KeyGenerator(){
                 @Override
                 public Object generate(Object o, Method method, Object... objects ) {
                StringBuilder sb = new StringBuilder("Cache:BaseService");
                sb.append(":" + o.getClass().getName().toString());
                sb.append(":" + method.getName().toString());

                StringBuilder s = new StringBuilder();
                for (Object obj : objects) {
                    if (Objects.nonNull(obj)){
                        s.append(obj.toString());
                    }
                }

                StringBuilder testss = sb;
                sb.append(":" + StringEncryptionUtils.StringToMd5(s.toString()));
                return sb.toString();
            }
        };
    }
}

註解

Spring為我們提供了幾個註解來支援Spring Cache。其核心主要是@Cacheable、@CachePut和@CacheEvict。
使用@Cacheable標記的方法,如果未快取,在執行後Spring Cache將快取其返回結果;已快取,則直接返回快取內容;
使用@CachePut標記的必然會在方法執行後,更新快取;
而使用@CacheEvict標記的方法會在方法執行前或者執行後移除Spring Cache中的某些元素。

1.1 @Cacheable

@Cacheable可以標記在一個方法上,也可以標記在一個類上。標記方法上表示該方法支援快取,標記類上表示該類下所有方法都支援快取。
對於一個支援快取的方法,Spring會在其被呼叫後將其返回值快取起來,以保證下次利用同樣的引數來執行該方法時可以直接從快取中獲取結果,而不需要再次執行該方法。
spring以鍵值對形式快取,key可以自定義設定,未設定則為預設值,value則是方法返回結果。@Cacheable可以指定三個屬性:value、key和condition。
@Cacheable 常用與查詢操作。

1.1.1 value指定cache快取空間
value指定當前結果快取在哪個cache下,value值可以是一個cache,或者多個cache
@Cacheable("goods")
public Goods find(Integer goodsId) {
  return null;
}

@Cacheable({"goods", "channel:goods"})
public Goods find(Integer goodsId) {
  return null;
}

1.1.2 指定cache的key值
設定快取資料的key值,未設定則為預設值。

預設策略
預設的key生成策略是通過KeyGenerator生成的,其預設策略如下:
如果方法沒有引數,則使用0作為key。
如果只有一個引數的話則使用該引數作為key。
如果引數多餘一個的話則使用所有引數的hashCode作為key

自定義key
@Cacheable(value="goods", key="goodsId")
public Goods find(Integer goodsId) {
  return null;
}


@Cacheable(value="goods", key="goods.goodsId")
public Goods find(Goods goods) {
  return null;
}
前言caching配置中
@Override
public KeyGenerator keyGenerator() {
	System.out.println("RedisCacheConfig.keyGenerator()");
	return new KeyGenerator(){
			 @Override
			 public Object generate(Object o, Method method, Object... objects ) {
			StringBuilder sb = new StringBuilder("Cache:BaseService");
			sb.append(":" + o.getClass().getName().toString());
			sb.append(":" + method.getName().toString());


			StringBuilder s = new StringBuilder();
			for (Object obj : objects) {
				if (Objects.nonNull(obj)){
					s.append(obj.toString());
				}
			}


			StringBuilder testss = sb;
			sb.append(":" + StringEncryptionUtils.StringToMd5(s.toString()));
			return sb.toString();
		}
	};
}
1.1.3 condition 設定快取條件
指定快取方法上,新增快取條件,當滿足該條件時候,結果才進行快取。
@Cacheable(value="goods", key="goods.goodsId", condition="goods.goodsId == 123456")
public Goods find(Goods goods) {
  return null;
}

1.2 @CachePut

@CachePut也可以宣告一個方法支援快取功能。與@Cacheable不同的是使用@CachePut標註的方法在執行前不會去檢查快取中是否存在之前執行過的結果,而是每次都會執行該方法,並將執行結果以鍵值對的形式存入指定的快取中。
@CachePut也可以標註在類上和方法上。使用@CachePut時我們可以指定的屬性跟@Cacheable是一樣的(這邊就不重複闡述)。
@CachePut常用與更新操作。

@CachePut(value="goods", key="goods.goodsId", condition="goods.goodsId == 123456")
public Goods update(Goods goods) {
  return null;
}

[email protected]

@CacheEvict可以標記在一個方法上,也可以標記在一個類上。標記方法上標識方法執行時候觸發清楚快取操作,當標記在一個類上時表示其中所有的方法的執行都會觸發快取的清除操作。
@CacheEvict可以指定的屬性有value、key、condition、allEntries和beforeInvocation。
其中value、key和condition的語義與@Cacheable對應的屬性類似。主要闡述新出現的兩個屬性allEntries和beforeInvocation。
@CacheEvict常用刪除操作。

1.3.1  allEntries屬性
allEntries是boolean型別,表示是否需要清除快取中的所有元素,預設為false。
當指定了allEntries為true時,Spring Cache將忽略指定的key。有的時候我們需要Cache一下清除所有的元素,這比一個一個清除元素更有效率。
@CacheEvict(value="goods", key="goods.goodsId", condition="goods.goodsId == 123456")
public void deleteGoods(Goods goods) {
}


@CacheEvict(value="goods", allEntries=true)
public void deleteAllGoods() {
}
1.3.2  beforeInvocation屬性
清除操作預設是在對應方法成功執行之後觸發的,即方法如果因為丟擲異常而未能成功返回時也不會觸發清除操作。
使用beforeInvocation可以改變觸發清除操作的時間,當我們指定該屬性值為true時,Spring會在呼叫該方法之前清除快取中的指定元素。
@CacheEvict(value="goods", beforeInvocation=true)
public void deleteGoods(Goods goods) {
}

1.4 @Caching

@Caching註解可以讓我們在一個方法或者類上同時指定多個Spring Cache相關的註解。其擁有三個屬性:cacheable、put和evict,分別用於指定@Cacheable、@CachePut和@CacheEvict。
@Caching(cacheable = @Cacheable("goods"), evict = { @CacheEvict("goods1"),
@CacheEvict(value = "goods2", allEntries = true) })
public Goods find(Integer goodsId) {
  return null;
}



相關推薦

Spring Cache 快取註解使用

前言SpringCache是SpringFramework3.1引入的新特性,提供了基於註解的快取配置方法.SpringCache是SpringFramework3.1引入的新特性,提供了基於註解的快取配置方法pom檔案引入<dependency> <gr

Spring快取註解@Cacheable

https://www.cnblogs.com/fashflying/p/6908028.html   從3.1開始,Spring引入了對Cache的支援。其使用方法和原理都類似於Spring對事務管理的支援。Spring Cache是作用在方法上的,其核心思想是這樣的:當我們在呼叫一個快取方法

Spring Boot annotation註解

頁面 osi 數據 加載 依賴註入 bsp 類型 數據庫 聲明 一:基於類的註解:(1)初始裝載@SpringBootApplication spring-boot程序入口標誌類@Configuration

Spring框架 @Valid註解的使用(嵌套類型的效驗)

Springboot 之@Valid註解@Valid註解可以實現數據的驗證,你可以定義實體,在實體的屬性上添加校驗規則,而在API接收數據時添加@valid關鍵字,這時你的實體將會開啟一個校驗的功能。@Valid 註解類型的使用:@Null限制只能為null@NotNull限制必須不為null@AssertF

Spring(七)基於註解配置

關於 int ESS schema 控制 div except strong ont 基於註解的配置 從 Spring 2.5 開始就可以使用註解來配置依賴註入。而不是采用 XML 來描述一個 bean 連線,你可以使用相關類,方法或字段聲明的註解,將 bean 配置移動到

Spring Data@DomainEvents註解

背景 在對一個Entity進行save操作時,往往需要觸發後續的業務流程,通常採用如下做法 public void saveUser(){ User user = ... user = repository.save(user); doSomething(user); }

spring+memcache配置+快取註解配置

spring+memcache配置快取註解@cahceable等 1.增加memcache pom檔案 <dependency> <groupId>com.googlecode.xmemcached</group

10、SSM框架-Spring AOP基於註解的宣告式AspectJ(10)

spring除了支援Schema方式配置AOP,還支援註解方式:使用@AspectJ風格的切面宣告。匯入需要的包:aspectjweaver.jar、aopalliance-1.0.jar 一、基本使用方法  1.1、啟用對@AspectJ的支援        Sprin

Spring AOP AspectJ註解和XML配置兩種實現(Maven構建)

xml配置 1.介面和實現類 public interface UserManager { public String findUserById(int userId); } @Service public class UserManage

SSM框架專案搭建系列(七)—Spring AOP基於註解的宣告式AspectJ

工程結構 其中AOP和com.ssm包下面的檔案不用管;dispatcher-servlet.xml和web.xml和之前專案中的內容一樣。 applicationContext.xml <?xml version="1.0" encodin

spring-kafkaKafkaListener註解深入解讀

簡介 Kafka目前主要作為一個分散式的釋出訂閱式的訊息系統使用,也是目前最流行的訊息佇列系統之一。因此,也越來越多的框架對kafka做了整合,比如本文將要說到的spring-kafka。 Kafka既然作為一個訊息釋出訂閱系統,就包括訊息生成者和訊息消費者。本文主要講述的spring-kafka框架的kaf

Spring系列註解配置+Spring整合junit+註解注入

## Spring系列之註解配置 **Spring是輕程式碼而重配置的框架,配置比較繁重,影響開發效率,所以註解開發是一種趨勢,註解代替xml配置檔案可以簡化配置,提高開發效率** **你本來要寫一段很長的程式碼來構造一個Beam物件,但是如果使用註解的話只要使用一個註解符號即可** ![在這裡插入圖

SPRING CACHE REDIS 註解式實現快取策略

為了解決資料庫查詢效率瓶頸,提升併發系統能力,快取的應用已經非常普遍和必要了。剛接觸REDIS時,如何使SPRING框架與REDIS更高效地整合,困擾了我很長時間。 先說下不使用SPRING CACHE時的兩種快取應用模式: 1.使用redis作為持久層的二級快

SpringEhcache快取註解

一、@Cacheable(value,key,condition) 1.說明 主要針對方法配置,能夠根據方法的請求引數對其結果進行快取 引數 解釋 example value 快取的名稱,在 sp

Spring快取註解@Cache,@CachePut , @CacheEvict,@CacheConfig使用

@Cacheable、@CachePut、@CacheEvict 註釋介紹 表 1. @Cacheable 作用和配置方法 @Cacheable 的作用 主要針對方法配置,能夠根據方法的請求引數對其結果進行快取 @Cacheable 主要的引數 value 快取的名稱,在 spring 配置檔案

《partner4java 講述Spring入門》spring cache支援(spring3.1如何使用cache 快取

(以下內容參照自官方文件;p4jorm下載地址http://blog.csdn.net/partner4java/article/details/8629578;cache demo下載地址http://download.csdn.net/detail/partner4ja

淺談快取註解驅動的快取 Spring cache介紹

在我們平常的工作當中,有好多場景需要用到快取技術,如redis,ehcache等來加速資料的訪問。作為淺談快取的第一篇筆者不想談論具體的快取技術,我更想介紹一下Spring中每次閱讀都會使我心中泛起波瀾的一個東西,那就是基於註解的快取技術。我們先看Spring參考文件中的一句

Spring Cache快取註解

[TOC] # Spring Cache快取註解 > 本篇文章程式碼示例在[Spring Cache簡單實現](baidu.com)上的程式碼示例加以修改。 ==只有使用public定義的方法才可以被快取,而private方法、protected 方法或者使用default 修飾符的方法都不能被快

Spring框架第四篇基於註解的DI註入

聯合 junit4 style troy ont student stc 創建配置文件 int 一、說明 [email protected]/* */,但意義不同的註解還有三個: 1)@Repository:註解在Dao實現類上 2)@Service:註解

Spring學習路(三)bean註解管理AOP操作

spec resource 自定義屬性 開始 java framework XML 方法名 jar包 在類上面、方法上面、屬性上面添加註解;並用bean來管理; 書寫方法:@註解名稱(屬性名稱=值) 第一步:導入jar包   導入spring-aop.jar(spri