基於springmodules的快取方案
簡介
通常在系統開發中,必不可少的要使用到快取(Cache),如使用者資訊、字典資訊都會使用快取來提高效能;但是如何使用好快取是個需要深入研究的話題,快取方案沒有通用性,針對不同的應用層面,快取的設計通常也是千差萬別的!這裡只是介紹了一種比較輕量級、無侵入的快取方案,該方案基於Spring+SpringModules。
目的
- 方法級別的快取
- 宣告式、無侵入
- 不繫結快取框架
- 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
-
<!-- 快取實現管理器 -->
- <bean id="cacheManager"
- class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
- </bean>
定義快取介面
Xml程式碼- <!-- 快取統一介面 -->
- <bean id="cacheProviderFacade"
- class="org.springmodules.cache.provider.ehcache.EhCacheFacade">
-
<
- </bean>
定義快取攔截器
Xml程式碼- <bean id="cachingInterceptor"
- class="org.springmodules.cache.interceptor.caching.MethodMapCachingInterceptor">
- <property name="cacheProviderFacade" ref="cacheProviderFacade" />
- <property name="cachingModels">
- <props>
- <prop key="com.cidp.system.service.IDictService.load*">cacheName=dictCache</prop>
- </props>
- </property>
- </bean>
定義重新整理攔截器
Xml程式碼- <bean id="flushingInterceptor"
- class="org.springmodules.cache.interceptor.flush.MethodMapFlushingInterceptor">
- <property name="cacheProviderFacade" ref="cacheProviderFacade" />
- <property name="flushingModels">
- <props>
- <prop key="com.cidp.system.service.IDictService.update*">cacheNames=dictCache</prop>
- </props>
- </property>
- </bean>
為業務層新增快取攔截器
Xml程式碼- <!-- 註冊自動代理建立,為業務Bean新增事務攔截器 -->
- <bean id="ServiceAutoProxyCreator"
- class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
- <property name="proxyTargetClass" value="false"></property>
- <property name="beanNames">
- <list>
- <value>*Service</value>
- </list>
- </property>
- <property name="interceptorNames">
- <list>
- <value>cachingInterceptor</value>
- <value>flushingInterceptor</value>
- </list>
- </property>
- </bean>
基於JDK1.5
JDK 1.5中出現了annotation這樣的好東西,使得我們可以在方法級別上做更精細的控制,將基於XML配置轉入原始碼中。
注:快取實現和快取介面配置同上,攔截器繫結同上
定義快取攔截器
Xml程式碼- <bean id="cachingAttributeSource"
- class="org.springmodules.cache.annotations.AnnotationCachingAttributeSource">
- </bean>
- <bean id="cachingInterceptor"
- class="org.springmodules.cache.interceptor.caching.MetadataCachingInterceptor">
- <property name="cacheProviderFacade" ref="cacheProviderFacade" />
- <property name="cachingAttributeSource" ref="cachingAttributeSource" />
- <property name="cachingModels">
- <props>
- <prop key="dictCaching">cacheName=dictCache</prop>
- </props>
- </property>
- </bean>
定義重新整理攔截器
Xml程式碼- <bean id="flushingAttributeSource"
- class="org.springmodules.cache.annotations.AnnotationFlushingAttributeSource">
- </bean>
- <bean id="flushingInterceptor"
- class="org.springmodules.cache.interceptor.flush.MetadataCachingInterceptor">
- <property name="cacheProviderFacade" ref="cacheProviderFacade" />
- <property name="flushingAttributeSource" ref="flushingAttributeSource" />
- <property name="flushingModels">
- <props>
- <prop key="dictFlushing">cacheNames=dictCache</prop>
- </props>
- </property>
- </bean>
Java程式碼
Java程式碼- @Cacheable(modelId = "dictCaching")
- public Dict load(Long id);
- @CacheFlush(modelId = "dictFlushing")
- public void update(Dict dict);
ehcache
springmodules支援<ehcache>標籤形式的配置方式,可簡化以上用<bean>定義攔截器的方式。如果專案中使用的快取框架為ehcache,可通過該標籤簡化配置