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

Spring?@Cacheable讀取配置常量方式

 更新時間:2021年12月31日 10:15:20   作者:EruruI  
這篇文章主要介紹了Spring?@Cacheable讀取配置常量方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

Spring @Cacheable讀取配置常量

屬性①:value

String REDIS_DATABASE="database";

cacheable的name。默認會在后面加上雙冒號,手動調(diào)用加上::

屬性②:key

String REDIS_KEY_PREFIX="'wtf_'";

需要使用單引號',防止被表達式解析

簡單使用

@Cacheable(value = RedisConstant.REDIS_DATABASE,
            key = (RedisConstant.REDIS_KEY_PREFIX + "+#wtf"))

Spring緩存管理(Cacheable)

Spring的緩存管理可謂是相當?shù)姆奖恪Ec其他功能的風(fēng)格一致,同樣的在需要管理的地方添加一個注解,可以是方法,也可以是類。

使用Spring Cache需要我們做兩方面的事:

  • 聲明某些方法使用緩存
  • 配置Spring對Cache的支持

和Spring對事務(wù)管理的支持一樣,Spring對Cache的支持也有基于注解和基于XML配置兩種方式。下面我們先來看看基于注解的方式。

基于注解的支持

Spring為我們提供了幾個注解來支持Spring Cache。其核心主要是@Cacheable和@CacheEvict。使用@Cacheable標記的方法在執(zhí)行后Spring Cache將緩存其返回結(jié)果,而使用@CacheEvict標記的方法會在方法執(zhí)行前或者執(zhí)行后移除Spring Cache中的某些元素。下面我們將來詳細介紹一下Spring基于注解對Cache的支持所提供的幾個注解。

@Cacheable

@Cacheable可以標記在一個方法上,也可以標記在一個類上。當標記在一個方法上時表示該方法是支持緩存的,當標記在一個類上時則表示該類所有的方法都是支持緩存的。對于一個支持緩存的方法,Spring會在其被調(diào)用后將其返回值緩存起來,以保證下次利用同樣的參數(shù)來執(zhí)行該方法時可以直接從緩存中獲取結(jié)果,而不需要再次執(zhí)行該方法。Spring在緩存方法的返回值時是以鍵值對進行緩存的,值就是方法的返回結(jié)果,至于鍵的話,Spring又支持兩種策略,默認策略和自定義策略,這個稍后會進行說明。需要注意的是當一個支持緩存的方法在對象內(nèi)部被調(diào)用時是不會觸發(fā)緩存功能的。

@Cacheable可以指定三個屬性,value、key和condition。

value屬性指定Cache名稱

value屬性是必須指定的,其表示當前方法的返回值是會被緩存在哪個Cache上的,對應(yīng)Cache的名稱。其可以是一個Cache也可以是多個Cache,當需要指定多個Cache時其是一個數(shù)組。

@Cacheable("cache1")//Cache是發(fā)生在cache1上的
public User find(Integer id) {
    return null;
}
@Cacheable({"cache1", "cache2"})//Cache是發(fā)生在cache1和cache2上的
public User find(Integer id) {
    return null;
}

使用key屬性自定義key

key屬性是用來指定Spring緩存方法的返回結(jié)果時對應(yīng)的key的。該屬性支持SpringEL表達式。當我們沒有指定該屬性時,Spring將使用默認策略生成key。我們這里先來看看自定義策略,至于默認策略會在后文單獨介紹。

自定義策略是指我們可以通過Spring的EL表達式來指定我們的key。這里的EL表達式可以使用方法參數(shù)及它們對應(yīng)的屬性。使用方法參數(shù)時我們可以直接使用“#參數(shù)名”或者“#p參數(shù)index”。下面是幾個使用參數(shù)作為key的示例。

@Cacheable(value="users", key="#id")
public User find(Integer id) {
    return null;
}
@Cacheable(value="users", key="#p0")
public User find(Integer id) {
    return null;
}
@Cacheable(value="users", key="#user.id")
public User find(User user) {
    return null;
}
@Cacheable(value="users", key="#p0.id")
public User find(User user) {
    return null;
}

除了上述使用方法參數(shù)作為key之外,Spring還為我們提供了一個root對象可以用來生成key。通過該root對象我們可以獲取到以下信息。

屬性名稱 描述 示例
methodName 當前方法名 #root.methodName
method 當前方法 #root.method.name
target 當前被調(diào)用的對象 #root.target
targetClass 當前被調(diào)用的對象的class #root.targetClass
args 當前方法參數(shù)組成的數(shù)組 #root.args[0]
caches 當前被調(diào)用的方法使用的Cache #root.caches[0].name

當我們要使用root對象的屬性作為key時我們也可以將“#root”省略,因為Spring默認使用的就是root對象的屬性。如:

@Cacheable(value={"users", "xxx"}, key="caches[1].name")
public User find(User user) {
    return null;
}

condition屬性指定發(fā)生的條件

有的時候我們可能并不希望緩存一個方法所有的返回結(jié)果。通過condition屬性可以實現(xiàn)這一功能。condition屬性默認為空,表示將緩存所有的調(diào)用情形。其值是通過SpringEL表達式來指定的,當為true時表示進行緩存處理;當為false時表示不進行緩存處理,即每次調(diào)用該方法時該方法都會執(zhí)行一次。如下示例表示只有當user的id為偶數(shù)時才會進行緩存。

@Cacheable(value={"users"}, key="#user.id", condition="#user.id%2==0")
public User find(User user) {
    System.out.println("find user by user " + user);
    return user;
}

@CachePut

在支持Spring Cache的環(huán)境下,對于使用@Cacheable標注的方法,Spring在每次執(zhí)行前都會檢查Cache中是否存在相同key的緩存元素,如果存在就不再執(zhí)行該方法,而是直接從緩存中獲取結(jié)果進行返回,否則才會執(zhí)行并將返回結(jié)果存入指定的緩存中。@CachePut也可以聲明一個方法支持緩存功能。與@Cacheable不同的是使用@CachePut標注的方法在執(zhí)行前不會去檢查緩存中是否存在之前執(zhí)行過的結(jié)果,而是每次都會執(zhí)行該方法,并將執(zhí)行結(jié)果以鍵值對的形式存入指定的緩存中。

@CachePut也可以標注在類上和方法上。使用@CachePut時我們可以指定的屬性跟@Cacheable是一樣的。

@CachePut(“users”)//每次都會執(zhí)行方法,并將結(jié)果存入指定的緩存中
public User find(Integer id) {
    return null;
}

@CacheEvict

@CacheEvict是用來標注在需要清除緩存元素的方法或類上的。當標記在一個類上時表示其中所有的方法的執(zhí)行都會觸發(fā)緩存的清除操作。@CacheEvict可以指定的屬性有value、key、condition、allEntries和beforeInvocation。

其中value、key和condition的語義與@Cacheable對應(yīng)的屬性類似。即value表示清除操作是發(fā)生在哪些Cache上的(對應(yīng)Cache的名稱);

key表示需要清除的是哪個key,如未指定則會使用默認策略生成的key;

condition表示清除操作發(fā)生的條件。

下面我們來介紹一下新出現(xiàn)的兩個屬性allEntries和beforeInvocation。

allEntries屬性

allEntries是boolean類型,表示是否需要清除緩存中的所有元素。默認為false,表示不需要。當指定了allEntries為true時,Spring Cache將忽略指定的key。有的時候我們需要Cache一下清除所有的元素,這比一個一個清除元素更有效率。

@CacheEvict(value="users", allEntries=true)
public void delete(Integer id) {
System.out.println("delete user by id: " + id);
}

beforeInvocation屬性

清除操作默認是在對應(yīng)方法成功執(zhí)行之后觸發(fā)的,即方法如果因為拋出異常而未能成功返回時也不會觸發(fā)清除操作。使用beforeInvocation可以改變觸發(fā)清除操作的時間,當我們指定該屬性值為true時,Spring會在調(diào)用該方法之前清除緩存中的指定元素。

@CacheEvict(value="users", beforeInvocation=true)
public void delete(Integer id) {
System.out.println("delete user by id: " + id);
}

其實除了使用@CacheEvict清除緩存元素外,當我們使用Ehcache作為實現(xiàn)時,我們也可以配置Ehcache自身的驅(qū)除策略,其是通過Ehcache的配置文件來指定的。由于Ehcache不是本文描述的重點,這里就不多贅述了。

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 如何基于java實現(xiàn)Gauss消元法過程解析

    如何基于java實現(xiàn)Gauss消元法過程解析

    這篇文章主要介紹了如何基于java實現(xiàn)Gauss消元法過程解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-10-10
  • Mybatis-Plus的SQL語句組拼原理說明

    Mybatis-Plus的SQL語句組拼原理說明

    這篇文章主要介紹了Mybatis-Plus的SQL語句組拼原理說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Spring配置類源碼分析詳解

    Spring配置類源碼分析詳解

    這篇文章主要介紹了Spring配置類解析源碼解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-09-09
  • Java、C++中子類對父類函數(shù)覆蓋的可訪問性縮小的區(qū)別介紹

    Java、C++中子類對父類函數(shù)覆蓋的可訪問性縮小的區(qū)別介紹

    這篇文章主要給大家介紹了關(guān)于Java、C++中子類對父類函數(shù)覆蓋的可訪問性縮小的區(qū)別的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-01-01
  • java文件操作之Path,Paths,Files

    java文件操作之Path,Paths,Files

    Java7中文件IO發(fā)生了很大的變化,專門引入了很多新的類,下面給大家分享用Files作為一個操作類的實例,需要的朋友可以參考
    2017-04-04
  • Java 8系列之Stream中萬能的reduce用法說明

    Java 8系列之Stream中萬能的reduce用法說明

    這篇文章主要介紹了Java 8系列之Stream中萬能的reduce用法說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • JAVA實現(xiàn)生成短鏈接的示例代碼

    JAVA實現(xiàn)生成短鏈接的示例代碼

    短鏈接就是將長度較長的鏈接壓縮成較短的鏈接,本文就來介紹一下JAVA實現(xiàn)生成短鏈接的示例代碼,具有一定的參考價值,感興趣的可以了解一下
    2023-08-08
  • Java 8 中 Map 騷操作之 merge() 的使用方法

    Java 8 中 Map 騷操作之 merge() 的使用方法

    本文簡單介紹了一下Map.merge()的方法,除此之外,Java 8 中的HashMap實現(xiàn)方法使用了TreeNode和 紅黑樹,原理很相似,今天通過本文給大家介紹Java 8 中 Map 騷操作之 merge() 的用法 ,需要的朋友參考下吧
    2021-07-07
  • 如何把Java程序窗口在屏幕中間顯示

    如何把Java程序窗口在屏幕中間顯示

    大家在日常Java開發(fā)中,可能會需要把程序窗口定位在屏幕中間,那該如何操作呢,下面來一起看看。
    2016-08-08
  • Java代理模式的示例詳解

    Java代理模式的示例詳解

    代理模式(Proxy Parttern)為一個對象提供一個替身,來控制這個對象的訪問,即通過代理對象來訪問目標對象。本文將通過示例詳細講解一下這個模式,需要的可以參考一下
    2022-02-02

最新評論

连云港市| 肥乡县| 民丰县| 南投县| 云和县| 陆良县| 思茅市| 和静县| 同江市| 卓资县| 凤城市| 徐闻县| 湘潭市| 正镶白旗| 台东县| 平昌县| 泰来县| 高尔夫| 会昌县| 文昌市| 邵武市| 鄄城县| 徐闻县| 衡阳县| 商南县| 普兰县| 图木舒克市| 绥阳县| 巴楚县| 太仆寺旗| 江永县| 华阴市| 南木林县| 滦平县| 慈利县| 神农架林区| 临洮县| 镇远县| 乌什县| 三明市| 霍城县|