Spring3.1 Cache注解


 

@Cacheable 支持如下幾個參數:

value:緩存位置名稱,不能為空,如果使用EHCache,就是ehcache.xml中聲明的cache的name

key:緩存的key,默認為空,既表示使用方法的參數類型及參數值作為key,支持SpEL

condition:觸發條件,只有滿足條件的情況才會加入緩存,默認為空,既表示全部都加入緩存,支持SpEL

 

例如:

Java代碼    收藏代碼
  1. //將緩存保存進andCache,並使用參數中的userId加上一個字符串(這里使用方法名稱)作為緩存的key   
  2. @Cacheable(value="andCache",key="#userId + 'findById'")  
  3. public SystemUser findById(String userId) {  
  4.     SystemUser user = (SystemUser) dao.findById(SystemUser.class, userId);        
  5.     return user ;         
  6. }  
  7. //將緩存保存進andCache,並當參數userId的長度小於32時才保存進緩存,默認使用參數值及類型作為緩存的key  
  8. @Cacheable(value="andCache",condition="#userId.length < 32")  
  9. public boolean isReserved(String userId) {  
  10.     System.out.println("hello andCache"+userId);  
  11.     return false;  
  12. }  

 

 

@CacheEvict 支持如下幾個參數:

value:緩存位置名稱,不能為空,同上

key:緩存的key,默認為空,同上

condition:觸發條件,只有滿足條件的情況才會清除緩存,默認為空,支持SpEL

allEntries:true表示清除value中的全部緩存,默認為false

 

例如:

Java代碼    收藏代碼
  1. //清除掉指定key的緩存  
  2. @CacheEvict(value="andCache",key="#user.userId + 'findById'")  
  3. public void modifyUserRole(SystemUser user) {  
  4.          System.out.println("hello andCache delete"+user.getUserId());  
  5. }  
  6.   
  7. //清除掉全部緩存  
  8. @CacheEvict(value="andCache",allEntries=true)  
  9. public final void setReservedUsers(String[] reservedUsers) {  
  10.     System.out.println("hello andCache deleteall");  
  11. }  

 

一般來說,我們的更新操作只需要刷新緩存中某一個值,所以定義緩存的key值的方式就很重要,最好是能夠唯一,因為這樣可以准確的清除掉特定的緩存,而不會影響到其它緩存值 ,

比如我這里針對用戶的操作,使用(userId+方法名稱)的方式設定key值 ,當然,你也可以找到更適合自己的方式去設定。

 

SpEL:Spring Expression Language

關於SpEL的介紹,可以參考如下地址:

http://static.springsource.org/spring/docs/3.1.0.M1/spring-framework-reference/html/expressions.html

 

 

了解了cache的注解之后,接下來說說如何使注解生效,其實就是需要在spring的配置文件中增加一些配置。

 

1.spring-cache

首先我們來看一下如何使用spring3.1自己的cache,

需要在命名空間中增加cache的配置

Xml代碼    收藏代碼
  1. <beans xmlns="http://www.springframework.org/schema/beans"  
  2.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"  
  3.      xmlns:cache="http://www.springframework.org/schema/cache"  
  4.     xsi:schemaLocation="  
  5.             http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd  
  6.             http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache-3.1.xsd">  

 

之后添加如下聲明:

Xml代碼    收藏代碼
  1.       <!-- 啟用緩存注解功能,這個是必須的,否則注解不會生效,另外,該注解一定要聲明在spring主配置文件中才會生效 -->  
  2. <cache:annotation-driven cache-manager="cacheManager"/>  
  3.   
  4.   
  5. <!-- spring自己的換管理器,這里定義了兩個緩存位置名稱 ,既注解中的value -->  
  6. <bean id="cacheManager" class="org.springframework.cache.support.SimpleCacheManager">  
  7.     <property name="caches">  
  8.         <set>  
  9.             <bean  
  10.                 class="org.springframework.cache.concurrent.ConcurrentCacheFactoryBean"  
  11.                 p:name="default" />  
  12.             <bean  
  13.                 class="org.springframework.cache.concurrent.ConcurrentCacheFactoryBean"  
  14.                 p:name="andCache" />  
  15.         </set>  
  16.     </property>  
  17. </bean>   

 

2.spring-ehcache

接下來說說對ehcache的支持,其實只需要把cacheManager換成EHCache的cacheManager即可,如下:

Xml代碼    收藏代碼
  1.        <!-- 啟用緩存注解功能,這個是必須的,否則注解不會生效,另外,該注解一定要聲明在spring主配置文件中才會生效 -->  
  2. <cache:annotation-driven cache-manager="cacheManager"/>  
  3.   
  4. <!-- cacheManager工廠類,指定ehcache.xml的位置 -->   
  5. <bean id="cacheManagerFactory" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"   
  6.     p:configLocation="classpath:/config/ehcache.xml" />   
  7.   
  8. <!-- 聲明cacheManager -->  
  9. <bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager"   
  10.     p:cacheManager-ref="cacheManagerFactory" />  

 

 

 ehcache.xml

Xml代碼    收藏代碼
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  3.     xsi:noNamespaceSchemaLocation="ehcache.xsd" updateCheck="true"  
  4.     monitoring="autodetect">  
  5.     <!--  
  6.     <diskStore path="java.io.tmpdir" /> -->  
  7.     <diskStore path="E:/cachetmpdir"/>  
  8.     <defaultCache maxElementsInMemory="10000" eternal="false"  
  9.         timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="true"  
  10.         maxElementsOnDisk="10000000" diskPersistent="false"  
  11.         diskExpiryThreadIntervalSeconds="120" memoryStoreEvictionPolicy="LRU" />  
  12.           
  13.     <cache name="andCache" maxElementsInMemory="10000"  
  14.         maxElementsOnDisk="1000" eternal="false" overflowToDisk="true"  
  15.         diskSpoolBufferSizeMB="20" timeToIdleSeconds="300" timeToLiveSeconds="600"  
  16.         memoryStoreEvictionPolicy="LFU" />  
  17. </ehcache>    

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM