spring中的緩存--Caching

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.註解:數據結構

image

在上面的註解中咱們經常使用到的有@Cacheable,@CacheEvict,@CachePut這3個,咱們目前也只學這3個框架

5. 測試

@Cacheable:用來定義緩存的。經常使用到是value,key;分別用來指明緩存的名稱和方法中參數,對於value你也可使用cacheName,在查看源代碼是咱們能夠看到:二者是指的同一個東西。spa

image

@CacheEvict:用來清理緩存。經常使用有cacheNames,allEntries(默認值false);分別表明了要清除的緩存名稱和是否所有清除(true表明所有清除)。3d

@CachePut:用來更新緩存,用它來註解的方法都會被執行,執行完後結果被添加到緩存中。該方法不能和@Cacheable同時在同一個方法上使用。code

6.對於@Caching註解來說,若是有兩種不一樣的需求,都是放在同一個方法上,這種需求若是隻是使用@CacheEvict或者@CachePut是沒法實現,由於他們不能多樣化的做用在同一個方法上。可使用@Caching(evict={@CacheEvict(「a1」),@CacheEvict(「a2」,allEntries=true)});@Caching源代碼以下:xml

image

7.下面咱們來看看CacheManager這個接口,源代碼以下:

image

不難看出,最終目的仍是用來獲取Cache這個對象的,而咱們緩存的數據都放在Cache中,部分源代碼以下:

image

8.上面的一些基本的東西都已說完,下面看看怎麼配置,讓緩存真正的起做用:

來看看官方文檔給的寫法,裏面重要的是spring-cache.xsd

image

其中的註解添加完,你就能夠中代碼中使用了:

image

在使用spring中緩存時,咱們通常選擇SimpleCacheManager這個類。

image

SimpleCacheManager源代碼以下:

image

能夠看出咱們須要配置caches這個屬性,來看看官方文檔的例子吧,在xml中添加以下代碼:建立了兩個緩存的名稱一個是books 一個是 default,咱們能夠只建立一個。

image

可是set中咱們因該怎麼寫,在文章開頭咱們提到了ConcurrentMap這個類,再看下下面的紅框中,咱們選擇一個,其中看其源代碼可知道ConcurrentMapCacheFactoryBean內容包含其餘兩個。全部咱們選擇這個。

image

其源代碼以下:

image

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:

image

 

 

當讓還有其它的緩存技術,例如ehcache,guava,jcache:

image

這個是我例子中用到的源代碼:spring緩存技術Caching例子

相關文章
相關標籤/搜索