如下內容是根據JSR107-Java-Caching-API,加上平時的使用總結的。html
注:建議在讀下面的內容以前,先去了解下JSR107中的內容,trust me!java
對上圖的說明:一個Application能夠使用多個CachingProvider;每一個CachingProvider能夠管理多個CacheManager;每一個CacheManager能夠管理多個Cache;每一個Cache中能夠有多個Entry。在Spring中使用這個Ehcache時,就須要定義CacheManager的name和CacheManager中管理的Cache。web
Entry存儲在Cache中時,有倆種機制: Store-By-Value和Store-By-Reference。spring
實際使用時是Reference還Value類型,可自行寫幾行代碼驗證下,本人驗證了下,在不配置特殊參數的狀況是Reference類型。 網絡
因爲JSR107只是規範,而實際的每一個廠商底層實現的不一樣,加上可能寫到磁盤或者Ehcache集羣(Entry要在網絡中傳輸),因此Entry中的key和value最好都實現java.io.Serializable。框架
以下是ehcache配置文件,暫且將該文件命名爲ehcache.xml(後面說明中要用到)。ide
<?xml version="1.0"?> <ehcache xmlms:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="ehcache.xsd"> <diskStore path="java.io.tmpdir" /> <cache name="userCache" maxElementsInMemory="1000" eternal="false" timeToIdleSeconds="0" timeToLiveSeconds="10" overflowToDisk="false" memoryStoreEvictionPolicy="LFU" /> </ehcache>
Spring中使用ehcache.xml以下圖所示,由EhcacheManagerFactoryBean源碼可知,這個ehcache.xml被用於建立一個CacheManager。Spring容器中userCacheManager對應的bean是一個CacheManager(若是以爲困惑,那麼先去了解下org.springframework.beans.factory.FactoryBean的做用——Mybatis的SqlSessionFactoryBean也使用了FactoryBean的功能,然後再去看下EhCacheManagerFactoryBean的源碼)。學習
<bean id="userCacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"> <property name="configLocation" value="classpath:ehcache.xml"/> <property name="cacheManagerName" value="userCacheManager"/> </bean>
至此咱們就有了一個name爲userCacheManager的CacheManager,以後就能夠使用name爲userCache的Cache了。spa
這種xml配置通常都有一個schema用於約束xml節點或節點屬性的值以及類型。因此能夠先去看下ehcache官方給出的ehcache.xsd,Spring中用於配置bean的xml也有它本身的schema,並且Spring的xsd在細節、註釋上比ehcache的好。設計
下圖上框中ref的值是ehcache節點中容許的元素種類;下框中name的值是ehcache節點的屬性name。好比從下圖中能夠看出ehcache節點中能夠出現0個或多個cache元素;可是diskStore只能出現0個或者1個;ehcache的屬性updateCheck的默認值是true。
配置不少,這裏就不細細列出了,建議去查看下官方的ehcache.xsd。
最近在看Ehcache的實現,發現其底層用到了LinkedHashmap、ConcurrentHashmap,且在此基礎之上作了必定的個性化,可是如何作到element的searchable、寫到disk等是如何實現,目前還沒看到。待後續努力。
在此,建議開發人員多去了解下JCP的規範,對了解框架有很大的幫助,好比
一樣,咱們在設計框架時,應該注重規範化,參考JCP的相應規範,好比Spring batch模塊就遵循了batch規範,這樣框架纔會易於學習、傳播。