溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

Spring?@Cacheable注解中key怎么使用

發(fā)布時(shí)間:2021-12-23 13:36:54 來(lái)源:億速云 閱讀:323 作者:iii 欄目:開(kāi)發(fā)技術(shù)

本篇內(nèi)容介紹了“Spring @Cacheable注解中key怎么使用”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

    Spring @Cacheable注解中key使用

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

    自定義策略是指我們可以通過(guò)Spring的EL表達(dá)式來(lái)指定我們的key。這里的EL表達(dá)式可以使用方法參數(shù)及它們對(duì)應(yīng)的屬性。使用方法參數(shù)時(shí)我們可以直接使用“#參數(shù)名”或者“#p參數(shù)index”。

    下面是幾個(gè)使用參數(shù)作為key的示例

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

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

    Spring?@Cacheable注解中key怎么使用

    當(dāng)我們要使用root對(duì)象的屬性作為key時(shí)我們也可以將“#root”省略,因?yàn)镾pring默認(rèn)使用的就是root對(duì)象的屬性。如:

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

    如果要調(diào)用當(dāng)前類(lèi)里面的方法

    當(dāng)我們要使用root對(duì)象的屬性作為key時(shí)我們也可以將“#root”省略,因?yàn)镾pring默認(rèn)使用的就是root對(duì)象的屬性。如:

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

    如果要調(diào)用當(dāng)前類(lèi)里面的方法

    @Override
        @Cacheable(value={"TeacherAnalysis_public_chart"}, key="#root.target.getDictTableName() + '_' + #root.target.getFieldName()")
        public List<Map<String, Object>> getChartList(Map<String, Object> paramMap) {
        }
        public String getDictTableName(){
            return "";
        }
        public String getFieldName(){
            return "";
        }
    condition屬性指定發(fā)生的條件

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

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

    @CachePut也可以標(biāo)注在類(lèi)上和方法上。使用@CachePut時(shí)我們可以指定的屬性跟@Cacheable是一樣的。

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

    @CacheEvict是用來(lái)標(biāo)注在需要清除緩存元素的方法或類(lèi)上的。當(dāng)標(biāo)記在一個(gè)類(lèi)上時(shí)表示其中所有的方法的執(zhí)行都會(huì)觸發(fā)緩存的清除操作。@CacheEvict可以指定的屬性有value、key、condition、allEntries和beforeInvocation。其中value、key和condition的語(yǔ)義與@Cacheable對(duì)應(yīng)的屬性類(lèi)似。即value表示清除操作是發(fā)生在哪些Cache上的(對(duì)應(yīng)Cache的名稱(chēng));key表示需要清除的是哪個(gè)key,如未指定則會(huì)使用默認(rèn)策略生成的key;condition表示清除操作發(fā)生的條件。下面我們來(lái)介紹一下新出現(xiàn)的兩個(gè)屬性allEntries和beforeInvocation。

    allEntries屬性

    allEntries是boolean類(lèi)型,表示是否需要清除緩存中的所有元素。默認(rèn)為false,表示不需要。當(dāng)指定了allEntries為true時(shí),Spring Cache將忽略指定的key。有的時(shí)候我們需要Cache一下清除所有的元素,這比一個(gè)一個(gè)清除元素更有效率。

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

    清除操作默認(rèn)是在對(duì)應(yīng)方法成功執(zhí)行之后觸發(fā)的,即方法如果因?yàn)閽伋霎惓6茨艹晒Ψ祷貢r(shí)也不會(huì)觸發(fā)清除操作。使用beforeInvocation可以改變觸發(fā)清除操作的時(shí)間,當(dāng)我們指定該屬性值為true時(shí),Spring會(huì)在調(diào)用該方法之前清除緩存中的指定元素。

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

    其實(shí)除了使用@CacheEvict清除緩存元素外,當(dāng)我們使用Ehcache作為實(shí)現(xiàn)時(shí),我們也可以配置Ehcache自身的驅(qū)除策略,其是通過(guò)Ehcache的配置文件來(lái)指定的。由于Ehcache不是本文描述的重點(diǎn),這里就不多贅述了,想了解更多關(guān)于Ehcache的信息,請(qǐng)查看我關(guān)于Ehcache的專(zhuān)欄。

    @Caching

    @Caching注解可以讓我們?cè)谝粋€(gè)方法或者類(lèi)上同時(shí)指定多個(gè)Spring Cache相關(guān)的注解。其擁有三個(gè)屬性:cacheable、put和evict,分別用于指定@Cacheable、@CachePut和@CacheEvict。

    @Caching(cacheable = @Cacheable("users"), evict = { @CacheEvict("cache2"),
    @CacheEvict(value = "cache3", allEntries = true) })
       public User find(Integer id) {
          return null;
       }
    使用自定義注解

    Spring允許我們?cè)谂渲每删彺娴姆椒〞r(shí)使用自定義的注解,前提是自定義的注解上必須使用對(duì)應(yīng)的注解進(jìn)行標(biāo)注。如我們有如下這么一個(gè)使用@Cacheable進(jìn)行標(biāo)注的自定義注解。

    @Target({ElementType.TYPE, ElementType.METHOD})
    @Retention(RetentionPolicy.RUNTIME)
    @Cacheable(value="users")
    public @interface MyCacheable {
    }

    那么在我們需要緩存的方法上使用@MyCacheable進(jìn)行標(biāo)注也可以達(dá)到同樣的效果

    @MyCacheable
       public User findById(Integer id) {
          System.out.println("find user by id: " + id);
          User user = new User();
          user.setId(id);
          user.setName("Name" + id);
          return user;
       }

    @Cacheable 拼接key

    @Cacheable(value = "page_user",key ="T(String).valueOf(#page).concat('-').concat(#pageSize)",unless = "#result=null")//由于page是int型,concat要求變量必須為String,所以強(qiáng)轉(zhuǎn)一下
    @Override
    public List<SysUserEntity> page(int page, int pageSize) {
        return userMapper.page(page,pageSize);
    }

    “Spring @Cacheable注解中key怎么使用”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

    向AI問(wèn)一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI