1. <ul id="0c1fb"></ul>

      <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
      <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区

      RELATEED CONSULTING
      相關(guān)咨詢
      選擇下列產(chǎn)品馬上在線溝通
      服務(wù)時(shí)間:8:30-17:00
      你可能遇到了下面的問題
      關(guān)閉右側(cè)工具欄

      新聞中心

      這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
      SpringCache的基本使用與實(shí)現(xiàn)原理詳解

      Spring Cache 概念

      成都創(chuàng)新互聯(lián)長(zhǎng)期為成百上千客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為宜秀企業(yè)提供專業(yè)的成都網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站,宜秀網(wǎng)站改版等技術(shù)服務(wù)。擁有十多年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。

      從Spring 3.1版本開始,提供了一種透明的方式來為現(xiàn)有的Spring 應(yīng)用添加cache,使用起來就像@Transaction一樣。在應(yīng)用層面與后端存儲(chǔ)之間,提供了一層抽象,這層抽象目的在于封裝各種可插拔的后端存儲(chǔ)( Ehcache Guava redis),最小化因?yàn)榫彺娼o現(xiàn)有業(yè)務(wù)代碼帶來的侵入。

      Spring 的緩存技術(shù)還具備相當(dāng)?shù)撵`活性。不僅能夠使用 SpEL(Spring Expression Language)來定義緩存的 key 和各種 condition,還提供開箱即用的緩存暫時(shí)存儲(chǔ)方案,也支持和主流的專業(yè)緩存比如 EHCache 集成。

      其特點(diǎn)總結(jié)例如以下:

      • 通過少量的配置 annotation 凝視就可以使得既有代碼支持緩存
      • 支持開箱即用 Out-Of-The-Box,即不用安裝和部署額外第三方組件就可以使用緩存
      • 支持 Spring Express Language,能使用對(duì)象的不論什么屬性或者方法來定義緩存的 key 和 condition
      • 支持 AspectJ,并通過事實(shí)上現(xiàn)不論什么方法的緩存支持
      • 支持自己定義 key 和自己定義緩存管理者,具有相當(dāng)?shù)撵`活性和擴(kuò)展性

      設(shè)計(jì)理念

      正如Spring框架的其它服務(wù)一樣,Spring cache 首先是提供了一層抽象,核心抽象主要體現(xiàn)在兩個(gè)接口上
      org.springframework.cache.Cache

      org.springframework.cache.CacheManager

      Cache代表緩存本身

      CacheManager代表對(duì)緩存的處理和管理等。抽象的意義在于屏蔽實(shí)現(xiàn)細(xì)節(jié)的差異和提供擴(kuò)展性,這一層Cache的抽象解耦了緩存的使用和緩存的后端存儲(chǔ),這樣后續(xù)可以方便的更換后端存儲(chǔ)。

      使用Spring Cache分三步:

      • 聲明緩存
      • 開啟Spring的cache功能
      • 配置后端的存儲(chǔ)

      聲明緩存

      @Cacheable("books")
      public Book findBook(ISBN isbn) {...}

      用法很簡(jiǎn)單,在方法上添加@cacheable等注解,表示緩存該方法的結(jié)果。

      當(dāng)方法有被調(diào)用時(shí),先檢查cache中有沒有針對(duì)該方法相同參數(shù)的調(diào)用發(fā)生過,如果有,從cache中查詢并返回結(jié)果。如果沒有,則執(zhí)行具體的方法邏輯,并把結(jié)果緩存到cache中。當(dāng)然這一系列邏輯對(duì)于調(diào)用者來說都是透明的。其它的緩存操作的注解包含如下(詳細(xì)說明可參見官方文檔):

      • @Cacheable triggers cache population
      • @CacheEvict triggers cache eviction
      • @CachePut updates the cache without interfering with the method execution
      • @Caching regroups multiple cache operations to be applied on a method
      • @CacheConfig shares some common cache-related settings at class-level

      開啟Spring Cache的支持

      或者使用注解@EnableCaching的方式

      配置緩存后端存儲(chǔ)

      Spring Cache提供了幾種內(nèi)置的后端存儲(chǔ)的實(shí)現(xiàn):下面都是CacheManager的具體實(shí)現(xiàn)。

      Spring Cache的基本使用與實(shí)現(xiàn)原理詳解

      此外,Spring Data提供了兩個(gè)緩存管理器:

      • RedisCacheManager(來自于Spring Data Redis項(xiàng)目)
      • GmfireCacheManager(來自于Spring Data GemFire項(xiàng)目

      假如使用memcached或者redis等分布式緩存的話,可以自己實(shí)現(xiàn)Cache和CacheManager,然后在Context里聲明即可。如果需要使用到多種不同的緩存實(shí)現(xiàn),可以用組合模式把各種不同的CacheManager封裝在一起。

      Spring Cache的基本使用與實(shí)現(xiàn)原理詳解

      緩存的key是如何生成

      我們都知道緩存的存儲(chǔ)方式一般是key value的方式,那么在Spring cache里,key是如何被設(shè)置的呢,在這里要引入KeyGenerator,它負(fù)責(zé)key的生成策略,默認(rèn)的使用SimpleKeyGenerator

      Spring Cache的基本使用與實(shí)現(xiàn)原理詳解

      Spring Cache的基本使用與實(shí)現(xiàn)原理詳解

      能看出來,其中就是有序參數(shù)數(shù)組的hash值。當(dāng)然用戶可以自定義key生成策略。

      Spring Cache的實(shí)現(xiàn)

      上面是Spring cache的大致使用方式,來看是Spring是如何實(shí)現(xiàn)的。

      在學(xué)習(xí)Spring源碼的時(shí)候,有兩點(diǎn)可以記住:

      • 大多數(shù)高級(jí)功能的實(shí)現(xiàn)都依賴Spring AOP
      • 大多數(shù)功能的組裝時(shí)機(jī)都依賴Sprin bean生命周期中的幾個(gè)回調(diào)接口

      記住了這些就比較容易理解Spring中的一些組件的實(shí)現(xiàn)及運(yùn)行時(shí)機(jī)制

      Spring cache也不例外,它是典型的Spring AOP實(shí)現(xiàn),在Spring里,aop可以簡(jiǎn)單的理解為代理(AspectJ除外),我們聲明了@Cacheable的方法的類,都會(huì)被代理,在代理中,實(shí)現(xiàn)緩存的查詢與設(shè)置操作。

      Cache 基礎(chǔ)設(shè)施的創(chuàng)建

      上一篇(Spring AOP 模塊概述)談到過,Spring AOP的創(chuàng)建過程,本質(zhì)是實(shí)現(xiàn)了一個(gè)BeanPostProcessor,在創(chuàng)建bean的過程中創(chuàng)建proxy,并且為proxy綁定所有適用于該bean的advisor,最終暴露給容器。

      Spring中AOP主幾個(gè)關(guān)鍵的概念 advisor  advice pointcut

      advice = 切面攔截中插入的行為

      pointcut = 切面的切入點(diǎn)

      advisor = advice + pointcut

      Spring cache也同樣與其它aop有類似的過程

      創(chuàng)建 cache proxy

      • 由InfrastructureAdvisorAutoProxyCreator負(fù)責(zé)的,它實(shí)現(xiàn)BeanPostProcessor所以可以在bean實(shí)例化返回給容器前有機(jī)會(huì)創(chuàng)建代理,它又繼承了AbstractAdvisorAutoProxyCreator,所以又具備了給代理類綁定advisor的能力。
      • pointcut的職責(zé)是由CacheOperationSourcePointcut完成的,它主要是通過方法上的cache相關(guān)的注解來判斷匹配是否需要切入

      Cache的攔截行

      Spring cache中生成cache代理對(duì)象使用的是CacheProxyFactoryBean工廠類。一般來說,在Spring中標(biāo)準(zhǔn)代理的創(chuàng)建都是基于ProxyFactoryBean,在這里,為了更方便的處理cache邏輯,Spring引入了CacheProxyFactoryBean來專門表示cache相關(guān)的代理,cache proxy能wrapper單例目標(biāo)對(duì)象,并且代理目標(biāo)對(duì)象實(shí)現(xiàn)的所有接口。

      Spring Cache的基本使用與實(shí)現(xiàn)原理詳解

      可以看到,在CacheProxyFactoryBean中,有個(gè)重要的屬性是CacheInterceptor,這個(gè)類是一個(gè)MethodInterceptor的實(shí)現(xiàn)類,這個(gè)類的職責(zé)是在目標(biāo)對(duì)象目標(biāo)方法上執(zhí)行具體緩存操作,這也就是上面提到的advice的職責(zé)。

      Spring Cache的基本使用與實(shí)現(xiàn)原理詳解

      繼續(xù)往下跟,return 的execute方法是父類CacheAspectSupport中的方法

      Spring Cache的基本使用與實(shí)現(xiàn)原理詳解

      在這個(gè)方法里,我們最終找到的操作緩存的最終邏輯

      • 判斷緩存條件
      • 獲取key
      • 獲取cache
      • 最終調(diào)用cache.get(key, Callable)方法,第二個(gè)參數(shù)是一個(gè)回調(diào),用于處理沒有命中緩存的情況:
        if cached, return; otherwise create, cache and return

      總結(jié)

      以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)創(chuàng)新互聯(lián)的支持。


      分享名稱:SpringCache的基本使用與實(shí)現(xiàn)原理詳解
      瀏覽路徑:http://www.ef60e0e.cn/article/geijgo.html
      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区
      1. <ul id="0c1fb"></ul>

        <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
        <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

        金山区| 尖扎县| 四子王旗| 潜江市| 湖北省| 营口市| 浦北县| 内丘县| 嘉荫县| 都兰县| 法库县| 南木林县| 进贤县| 拉萨市| 株洲县| 集贤县| 海安县| 吉水县| 龙井市| 那曲县| 马鞍山市| 宁化县| 连城县| 汝南县| 城市| 四会市| 武冈市| 庄浪县| 双峰县| 深水埗区| 岳西县| 仁寿县| 祁东县| 文昌市| 呼图壁县| 中西区| 桐城市| 大石桥市| 东阳市| 聊城市| 自贡市|