1.spring從3.1開始支持緩存功能。spring 自帶的緩存機制它只在方法上起做用,對於你使用其餘持久化層的框架來說,是沒有影響的,相對來說這種緩存方式仍是不錯的選擇。java
2.提供緩存的接口:org.springframework.cache.Cache ;org.springframework.cache.CacheManager這兩個接口都在context中,一個是用來提供緩存的,一個是用來提供管理緩存的。spring
3.緩存是使用鍵值對的形式存在的,對應Java中就要使用Map<K,V>這種數據結構來處理,推薦使用java.util.concurrent.ConcurrentMap來存放。緩存
4.註解:數據結構
在上面的註解中咱們經常使用到的有@Cacheable,@CacheEvict,@CachePut這3個,咱們目前也只學這3個框架
5. 測試
@Cacheable:用來定義緩存的。經常使用到是value,key;分別用來指明緩存的名稱和方法中參數,對於value你也可使用cacheName,在查看源代碼是咱們能夠看到:二者是指的同一個東西。spa
@CacheEvict:用來清理緩存。經常使用有cacheNames,allEntries(默認值false);分別表明了要清除的緩存名稱和是否所有清除(true表明所有清除)。3d
@CachePut:用來更新緩存,用它來註解的方法都會被執行,執行完後結果被添加到緩存中。該方法不能和@Cacheable同時在同一個方法上使用。code
6.對於@Caching註解來說,若是有兩種不一樣的需求,都是放在同一個方法上,這種需求若是隻是使用@CacheEvict或者@CachePut是沒法實現,由於他們不能多樣化的做用在同一個方法上。可使用@Caching(evict={@CacheEvict(「a1」),@CacheEvict(「a2」,allEntries=true)});@Caching源代碼以下:xml
7.下面咱們來看看CacheManager這個接口,源代碼以下:
不難看出,最終目的仍是用來獲取Cache這個對象的,而咱們緩存的數據都放在Cache中,部分源代碼以下:
8.上面的一些基本的東西都已說完,下面看看怎麼配置,讓緩存真正的起做用:
來看看官方文檔給的寫法,裏面重要的是spring-cache.xsd
其中的註解添加完,你就能夠中代碼中使用了:
在使用spring中緩存時,咱們通常選擇SimpleCacheManager這個類。
SimpleCacheManager源代碼以下:
能夠看出咱們須要配置caches這個屬性,來看看官方文檔的例子吧,在xml中添加以下代碼:建立了兩個緩存的名稱一個是books 一個是 default,咱們能夠只建立一個。
可是set中咱們因該怎麼寫,在文章開頭咱們提到了ConcurrentMap這個類,再看下下面的紅框中,咱們選擇一個,其中看其源代碼可知道ConcurrentMapCacheFactoryBean內容包含其餘兩個。全部咱們選擇這個。
其源代碼以下:
9.如今基本的配置都完成,如今就須要配置本身的bean去作下測試了。
編寫一個邏輯處理的類,把該類放在xml定義:
public class TestCacheService { //經過參數name @Cacheable(cacheNames="uCache",key="#name") public User get(String name){ User u = new User(); u.setAge(12); u.setUserName("jobs"); System.out.println("沒有緩存"+name); return u; } //經過方法名 @Cacheable(value="uCache",key="#root.methodName") public User get2(){ User u = new User(); u.setAge(12); u.setUserName("gate"); System.out.println("沒有緩存"); return u; } }
編寫一個測試類
public class TestCache { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("config/spring-cache.xml"); TestCacheService testCache = (TestCacheService)context.getBean("testCache"); testCache.get("jobs"); testCache.get("jobs");
}
}
運行測試一下,會發現報錯,緣由是xml中的p:name沒有綁定:
在xml中添加:xmlns:p="http://www.springframework.org/schema/p"就可。
測試結果只有一行被打印處理,說明咱們的緩存起做用了。
10.如何從緩存中提取緩存的數據:
首先咱們要知道怎麼從緩存中提取已經緩存過的數據:
public class TestCache { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("config/spring-cache.xml"); TestCacheService testCache = (TestCacheService)context.getBean("testCache"); CacheManager cm = (CacheManager) context.getBean("cacheManager"); //添加數據到緩存中 testCache.get("job"); Cache uCache = cm.getCache("uCache"); //經過參數做爲key,獲得對應的value User u1 = (User) uCache.get("job").get(); u1.show(); //添加數據到緩存中 testCache.get2(); //經過方法名做爲key,獲得對應value User u2 = (User) uCache.get("get2").get(); u2.show(); } }
固然還有其餘形式做爲其key,類如官方文檔就給了以下參考,它是使用spel:
當讓還有其它的緩存技術,例如ehcache,guava,jcache:
這個是我例子中用到的源代碼:spring緩存技術Caching例子