首先在啟動類上新增@enablecache註解,表示開始註解快取功能
特別注意:spring框架中所有的註解都是通過aop的原理實現的,即spring框架為我們建立**物件,**物件去實現註解的功能。所以當乙個支援快取的方法,在物件內部被呼叫的時候,是不會觸發快取功能的,因為當前類方法呼叫當前類方法使用的是this.呼叫,也就是當前物件,而不是**物件,增強沒有上生效。
@cacheable、@cacheput、@cacheevict是spring3.1版本以後對快取支援的註解。這些註解作用在方法上。使用了spring aop的思想。@cacheable、@cacheput、@cacheevict這些註解不是專門針對redis的,而是針對本地快取的。但是在springboot框架中,可以使用這些註解配合redis進行使用。
使用存在查詢的方法上
此註解標記可以使用在乙個方法上也可以使用在乙個類上。標記在方法上表示該方法是支援快取的,標記在類上表示該類中所有的方法都是支援快取的。
該註解的作用原理:首先在執行查詢方法之前,會先查詢快取,如果在快取中查詢到想要的資料就會直接返回,不會再執行此方法;如果在快取中沒有查到就會查詢資料庫,並且將查詢結果作為該方法的返回值返回。spring cache會將該方法的返回值快取起來。保證下次利用同樣的引數執行該方法的時候,直接從快取中獲取結果,而不需要執行此方法。
在快取方法的返回值的時候,是以鍵值對的形式儲存到快取中。值就是該方法的返回結果。鍵需要自己指定,spring中支援兩種生成key的策略。el表示式和自定義。在el表示式中詳細說明。
@cacheable註解中可以定義三個屬性@cacheable(value="",key="",condition="",unless="")
value:
指定快取的名稱,該屬性必須指定。表示當前方法的返回值會被儲存到哪個快取上。也可以指定多個。
key:
指定快取結果對應的key。支援spel表示式的方式賦值。可以不指定,不指定的時候使用預設值,預設值就是將方法的所有引數進行組合,作為key。spring還提供了root物件來生成key,通過root物件可以獲取到一下資訊:
表示快取條件,不設定的時候,快取所有的返回結果。設定的時候,通過spel表示式指定,只有當表示式為true的時候,快取才會被觸發,將返回結果快取。
@cacheable(cachenames = "sum", key = "#root.args[0]", condition = "#id!=null", unless = "#result==null")
public mapselectsum(long id)
unless除...之外。也表示快取條件,不設定的時候,快取所有的返回結果。設定的時候,通過spel表示式指定,只有當表示式為false的時候,快取才會被觸發,將返回結果快取。
@cacheable(cachenames = "sum", key = "#root.args[0]", condition = "#id!=null", unless = "#result==null")
public mapselectsum(long id)
注意:condition和unless的區別,condition用方法的引數作為判斷條件,也就是說根據犯法的引數判斷是否資訊存放到快取中。而unless是將方法的返回值作為判斷條件,也就是說根據方法的返回值判斷,是否將資訊存放到快取中。使用在新增和修改的方法上
後置增強
@cacheput標註的方法在執行之前不會去查詢快取,每次都會執行該方法,在該方法執行完後,將該方法的返回值以鍵值對的形式儲存到快取中。
其屬性和@cacheable屬性一樣。
value屬性,必須指定。
用在清除快取到方法上。
可以標記在類上,也可以標記在方法上,標記在雷傷的時候表示該類中所有的方法執行都會觸發清除快取的操作
該註解可以定義的屬性有:value、key、condition、allentries和beforeinvocation。
value:
指定快取的名稱
key:
指定要清除的快取的key。不指定將會使用預設生成策略生成的key,預設生成策略就是將方法中所有引數拼接為key
condition:
指定觸發清除快取操作的條件。
allentries:
該屬性是乙個boolean型別的,表示是否清除快取中的所有的資料。預設的是false,當指定為true的時候,將會忽略指定的key。會清除快取中所有的資料。
beforeinvocation:
清除操作預設是在對應方法成功執行之後觸發的,即方法如果因為丟擲異常而未能成功返回時也不會觸發清除操作。使用beforeinvocation可以改變觸發清除操作的時間,當我們指定該屬性值為true時,spring會在呼叫該方法之前清除快取中的指定元素。
擴充套件:ehcache中的清除快取策略
eternal====快取中物件是否永久有效,即是否永駐記憶體,true時將忽略timetoidleseconds和timetoliveseconds
timetoidleseconds==快取資料在失效前的允許閒置時間(單位:秒),僅當eternal=false時使用,預設值是0表示可閒置時間無窮大,此為可選屬性,即訪問這個cache中元素的最大間隔時間,若超過這個時間沒有訪問此cache中的某個元素,那麼此元素將被從cache中清除
timetoliveseconds====快取資料在失效前的允許存活時間(單位:秒),僅當eternal=false時使用,預設值是0表示可存活時間無窮大,即從建立開始計時,當超過這個時間時,此元素將從cache中清除
標記在類上。有時候乙個類中可能會有多個快取操作,而這些快取使用的可能是同乙個快取,這個時候就可以使用@cacheconfig來配置快取的名稱。
springboot啟動器上新增此註解,表示開啟註解快取功能,否則註解不生效。
springboot中通過cors協議解決跨域問題
1 對於前後端分離的專案來說,如果前端專案與後端專案部署在兩個不同的域下,那麼勢必會引起跨域問題的出現。針對跨域問題,我們可能第乙個想到的解決方案就是jsonp,並且以前處理跨域問題我基本也是這麼處理。但是jsonp方式也同樣有不足,不管是對於前端還是後端來說,寫法與我們平常的ajax寫法不同,同樣...
springboot中通過cors協議解決跨域問題
1 對於前後端分離的專案來說,如果前端專案與後端專案部署在兩個不同的域下,那麼勢必會引起跨域問題的出現。針對跨域問題,我們可能第乙個想到的解決方案就是jsonp,並且以前處理跨域問題我基本也是這麼處理。但是jsonp方式也同樣有不足,不管是對於前端還是後端來說,寫法與我們平常的ajax寫法不同,同樣...
springboot中通過cors協議解決跨域問題
1 對於前後端分離的專案來說,如果前端專案與後端專案部署在兩個不同的域下,那麼勢必會引起跨域問題的出現。針對跨域問題,我們可能第乙個想到的解決方案就是jsonp,並且以前處理跨域問題我基本也是這麼處理。但是jsonp方式也同樣有不足,不管是對於前端還是後端來說,寫法與我們平常的ajax寫法不同,同樣...