1. 程式人生 > >基於springmodules的快取方案

基於springmodules的快取方案

簡介    

      通常在系統開發中,必不可少的要使用到快取(Cache),如使用者資訊、字典資訊都會使用快取來提高效能;但是如何使用好快取是個需要深入研究的話題,快取方案沒有通用性,針對不同的應用層面,快取的設計通常也是千差萬別的!這裡只是介紹了一種比較輕量級、無侵入的快取方案,該方案基於Spring+SpringModules。

目的

  1. 方法級別的快取
  2. 宣告式、無侵入
  3. 不繫結快取框架
  4. JDK 1.4/1.5均適用

實現

基於JDK1.4

      JDK1.4中可使用方法對映、元資料(commons-attributes)兩種方式宣告需要快取的方法。由於元資料需要匯入額外的包,今後JDK升級後無法轉換為annotation,且commons-attributes包本身有點BUG,故不在本文討論之中。

定義快取實現

目前支援的實現有:

  • org.springmodules.cache.provider.jboss.JbossCacheManagerFactoryBean

  • org.springmodules.cache.provider.jcs.JcsManagerFactoryBean

  • org.springmodules.cache.provider.oscache.OsCacheManagerFactoryBean

  • org.springframework.cache.ehcache.EhCacheManagerFactoryBean 

Xml程式碼  收藏程式碼
  1. <!-- 快取實現管理器 -->
      
  2. <bean id="cacheManager"  
  3.                 class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">  
  4. </bean>  

定義快取介面

Xml程式碼  收藏程式碼
  1. <!-- 快取統一介面 -->  
  2. <bean id="cacheProviderFacade"  
  3.     class="org.springmodules.cache.provider.ehcache.EhCacheFacade">  
  4.     <
    property name="cacheManager" ref="cacheManager" />  
  5. </bean>  

定義快取攔截器

Xml程式碼  收藏程式碼
  1. <bean id="cachingInterceptor"  
  2.     class="org.springmodules.cache.interceptor.caching.MethodMapCachingInterceptor">  
  3.     <property name="cacheProviderFacade" ref="cacheProviderFacade" />  
  4.     <property name="cachingModels">  
  5.         <props>  
  6.             <prop key="com.cidp.system.service.IDictService.load*">cacheName=dictCache</prop>  
  7.         </props>            
  8.     </property>  
  9. </bean>  

定義重新整理攔截器

Xml程式碼  收藏程式碼
  1. <bean id="flushingInterceptor"  
  2.     class="org.springmodules.cache.interceptor.flush.MethodMapFlushingInterceptor">  
  3.     <property name="cacheProviderFacade" ref="cacheProviderFacade" />       
  4.     <property name="flushingModels">  
  5.         <props>  
  6.             <prop key="com.cidp.system.service.IDictService.update*">cacheNames=dictCache</prop>  
  7.         </props>  
  8.     </property>  
  9. </bean>  

為業務層新增快取攔截器

Xml程式碼  收藏程式碼
  1. <!-- 註冊自動代理建立,為業務Bean新增事務攔截器 -->  
  2. <bean id="ServiceAutoProxyCreator"  
  3.     class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">  
  4.     <property name="proxyTargetClass" value="false"></property>  
  5.     <property name="beanNames">  
  6.         <list>  
  7.             <value>*Service</value>  
  8.         </list>  
  9.     </property>  
  10.     <property name="interceptorNames">  
  11.         <list>  
  12.             <value>cachingInterceptor</value>  
  13.             <value>flushingInterceptor</value>                                
  14.         </list>  
  15.     </property>  
  16. </bean>  

基於JDK1.5

      JDK 1.5中出現了annotation這樣的好東西,使得我們可以在方法級別上做更精細的控制,將基於XML配置轉入原始碼中。

注:快取實現和快取介面配置同上,攔截器繫結同上

定義快取攔截器

Xml程式碼  收藏程式碼
  1. <bean id="cachingAttributeSource"  
  2.   class="org.springmodules.cache.annotations.AnnotationCachingAttributeSource">  
  3. </bean>  
  4. <bean id="cachingInterceptor"  
  5.     class="org.springmodules.cache.interceptor.caching.MetadataCachingInterceptor">  
  6.     <property name="cacheProviderFacade" ref="cacheProviderFacade" />  
  7.     <property name="cachingAttributeSource" ref="cachingAttributeSource" />         
  8.     <property name="cachingModels">  
  9.         <props>  
  10.             <prop key="dictCaching">cacheName=dictCache</prop>  
  11.         </props>            
  12.     </property>  
  13. </bean>  

定義重新整理攔截器

Xml程式碼  收藏程式碼
  1. <bean id="flushingAttributeSource"  
  2.   class="org.springmodules.cache.annotations.AnnotationFlushingAttributeSource">  
  3. </bean>     
  4. <bean id="flushingInterceptor"  
  5.     class="org.springmodules.cache.interceptor.flush.MetadataCachingInterceptor">  
  6.     <property name="cacheProviderFacade" ref="cacheProviderFacade" />   
  7.     <property name="flushingAttributeSource" ref="flushingAttributeSource" />           
  8.     <property name="flushingModels">  
  9.         <props>  
  10.             <prop key="dictFlushing">cacheNames=dictCache</prop>  
  11.         </props>  
  12.     </property>  
  13. </bean>  

Java程式碼

Java程式碼  收藏程式碼
  1. @Cacheable(modelId = "dictCaching")  
  2. public Dict load(Long id);    
  3. @CacheFlush(modelId = "dictFlushing")  
  4. public void update(Dict dict);  

ehcache 

      springmodules支援<ehcache>標籤形式的配置方式,可簡化以上用<bean>定義攔截器的方式。如果專案中使用的快取框架為ehcache,可通過該標籤簡化配置