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

springboot 緩存@EnableCaching實例

 更新時間:2021年11月05日 09:47:40   作者:micro_hz  
這篇文章主要介紹了springboot 緩存@EnableCaching實例,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

springboot 緩存@EnableCaching

很多時候系統(tǒng)的瓶頸都在一些比較復(fù)雜的IO操作,例如讀取數(shù)據(jù)庫,如果一些比較穩(wěn)定的數(shù)據(jù),一般的解決方案就是用緩存。spring boot提供了比較簡單的緩存方案。只要使用 @EnableCaching即可完成簡單的緩存功能。

緩存的實現(xiàn)有多種實現(xiàn),ConcurentHashMapCache , GuavaCache, EnCacheCache等多種實現(xiàn),spring boot 有默認(rèn)的實現(xiàn)。本文不深入源碼解讀,首先用起來。

此處我們模擬要緩存的User

class User {
 private Long id;
 private String name;
// setter getter
}

然后我們業(yè)務(wù)對象:

import javax.annotation.PostConstruct;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.stereotype.Component;
/**
 * @author micro
 * @date 2017年8月2日
 * @description :
 */
@Component
@EnableCaching
public class UserDao {
 private Map<Long, User> userMap;
 @PostConstruct
 public void init() {
  //模擬數(shù)據(jù)庫
  userMap = new HashMap<Long, User>();
  userMap.put(1L, new User(1L,"micro1"));
  userMap.put(2L, new User(2L, "micro2"));
 }
 
 @Cacheable("user")  // 注解key屬性可以執(zhí)行緩存對象user(可以理解為一個map)的key 
 public User getUser(Long userId) {
  System.out.println("查詢數(shù)據(jù)庫:userId ->" + userId);
  return userMap.get(userId);
 }
 
 @Cacheable(value = "nameCache", key = "#name")
 public User getUserByName(Long userId, String name) {
  System.out.println("查詢數(shù)據(jù)庫:userId ->" + userId);
  return userMap.get(userId);
 }
 
 @Cacheable("nameCache")
 public User getUserByName(String name) {
  System.out.println("查詢數(shù)據(jù)庫:userName : " + name);
  for (Long k : userMap.keySet()) {
   if (userMap.get(k).equals(name)) {
    return userMap.get(k);
   }
  }
  return null;
 }
 
 @CachePut("user") // 與Cacheable區(qū)別就是Cacheable先看緩存如果有,直接緩存換回,CachePut則是每次都會調(diào)用并且把返回值放到緩存
 public User getUser2(Long userId) {
  System.out.println("查詢數(shù)據(jù)庫:userId : " + userId);
  return userMap.get(userId);
 }
 
 @CacheEvict("user")
 public void removeFromCache(Long userId) {
  return ;
 }
}

然后我們編寫啟動類:

@SpringBootApplication
public class CacheTest implements CommandLineRunner {
 @Autowired
 private UserDao userDao; 
 public static void main(String[] args) {
  new SpringApplication(CacheTest.class).run(args);
 } 
 @Override
 public void run(String... args) throws Exception {
  System.out.println("第一次查詢");
  System.out.println(userDao.getUser(1L));
  System.out.println("第二次查詢");
  System.out.println(userDao.getUser(1L));
  userDao.removeFromCache(1L);// 移除緩存
  System.out.println("第三次查詢");
  userDao.getUser(1L);// 沒有緩存了  
  System.out.println("--------");
  // 測試不同的key緩存
  userDao.getUserByName("micro1");
  userDao.getUserByName(1L, "micro1");// 指定了參數(shù)name 為key 此次讀取緩存
 }
}

打印結(jié)果:

第一次查詢
查詢數(shù)據(jù)庫:userId ->1
User@65da01f4
第二次查詢
User@65da01f4
第三次查詢
查詢數(shù)據(jù)庫:userId ->1
--------
查詢數(shù)據(jù)庫:userName : micro1

Spring @EnableCaching的工作原理

1、開發(fā)人員使用注解@EnableCaching

2、注解@EnableCaching導(dǎo)入CachingConfigurationSelector

3、CachingConfigurationSelector根據(jù)注解@EnableCaching 屬性AdviceMode mode決定引入哪些配置類

  • PROXY : AutoProxyRegistrar,ProxyCachingConfiguration;
  • ASPECTJ : AspectJCachingConfiguration;

本文以mode=PROXY為例;

4、CachingConfigurationSelector導(dǎo)入AutoProxyRegistrar會確保容器中存在一個自動代理創(chuàng)建器(APC);

  • 用于確保目標(biāo)bean需要被代理時有可用的代理創(chuàng)建器

5、ProxyCachingConfiguration向容器定義如下基礎(chǔ)設(shè)施bean

  • 名稱為org.springframework.cache.config.internalCacheAdvisor類型為BeanFactoryCacheOperationSourceAdvisor的bean
  • 名稱為cacheOperationSource類型為CacheOperationSource的bean

用于獲取方法調(diào)用時最終應(yīng)用的Spring Cache注解的元數(shù)據(jù)

  • 名稱為cacheInterceptor類型為CacheInterceptor的bean

一個MethodInterceptor,包裹在目標(biāo)bean外面用于操作Cache的AOP Advice。

6、AutoProxyRegistrar在容器啟動階段對每個bean創(chuàng)建進(jìn)行處理,如果該bean中有方法應(yīng)用了Spring Cache注解,為其創(chuàng)建相應(yīng)的代理對象,包裹上面定義的BeanFactoryCacheOperationSourceAdvisor bean;

7、使用了Spring Cache注解的bean方法被調(diào)用,其實調(diào)用首先發(fā)生在代理對象上,先到達(dá)cacheInterceptor,然后才是目標(biāo)bean方法的調(diào)用;

  • cacheInterceptor既處理調(diào)用前緩存操作,也處理調(diào)用返回時緩存操作

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

相關(guān)文章

  • java創(chuàng)建多級目錄文件的實例講解

    java創(chuàng)建多級目錄文件的實例講解

    下面小編就為大家分享一篇java創(chuàng)建多級目錄文件的實例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-01-01
  • SpringBoot+SpringBatch+Quartz整合定時批量任務(wù)方式

    SpringBoot+SpringBatch+Quartz整合定時批量任務(wù)方式

    這篇文章主要介紹了SpringBoot+SpringBatch+Quartz整合定時批量任務(wù)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • JAVA Integer類型自加實例詳解

    JAVA Integer類型自加實例詳解

    這篇文章主要介紹了JAVA Integer類型自加實例詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-05-05
  • java使用common-fileupload實現(xiàn)文件上傳

    java使用common-fileupload實現(xiàn)文件上傳

    這篇文章主要為大家詳細(xì)介紹了java使用common-fileupload實現(xiàn)文件上傳的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • 詳解java中反射機制(含數(shù)組參數(shù))

    詳解java中反射機制(含數(shù)組參數(shù))

    這篇文章主要介紹了詳解java中反射機制(含數(shù)組參數(shù))的相關(guān)資料,希望通過本文能幫助到大家,讓大家理解掌握這部分內(nèi)容,需要的朋友可以參考下
    2017-10-10
  • java 如何為文件及文件夾添加權(quán)限

    java 如何為文件及文件夾添加權(quán)限

    這篇文章主要介紹了java 如何為文件及文件夾添加權(quán)限的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • java使用udp實現(xiàn)簡單多人聊天功能

    java使用udp實現(xiàn)簡單多人聊天功能

    這篇文章主要為大家詳細(xì)介紹了java使用udp實現(xiàn)簡單多人聊天功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • Java集合定義與用法實例總結(jié)【Set、List與Map】

    Java集合定義與用法實例總結(jié)【Set、List與Map】

    這篇文章主要介紹了Java集合定義與用法,結(jié)合實例形式總結(jié)分析了Java集合中Set、List和Map相關(guān)概念、功能、用法及操作注意事項,需要的朋友可以參考下
    2018-08-08
  • spring使用Filter過濾器對Response返回值進(jìn)行修改的方法

    spring使用Filter過濾器對Response返回值進(jìn)行修改的方法

    這篇文章主要介紹了spring使用Filter過濾器對Response返回值進(jìn)行修改,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-09-09
  • java網(wǎng)上圖書商城(4)購物車模塊1

    java網(wǎng)上圖書商城(4)購物車模塊1

    這篇文章主要為大家詳細(xì)介紹了java網(wǎng)上圖書商城,購物車模塊,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-12-12

最新評論

上饶县| 蓬溪县| 山东| 安龙县| 九江市| 会泽县| 香港 | 方正县| 营口市| 永登县| 五指山市| 耒阳市| 青田县| 嵩明县| 乐都县| 綦江县| 桃源县| 永年县| 民乐县| 逊克县| 广宁县| 札达县| 饶阳县| 锡林郭勒盟| 罗田县| 辉南县| 叶城县| 万宁市| 罗甸县| 平潭县| 富锦市| 延安市| 米林县| 洪泽县| 贺兰县| 甘谷县| 张家港市| 西乌| 嘉峪关市| 宜阳县| 三明市|