项目需要缓存,google了一下,发现spring module有现成的东西可用,随即拿来看看。发现还是比较好用的。
改cache采用了aop的方式进行cache的写入和刷出。使用spring风格,上手容易。
系统负载不高,因此对于该缓存方法的性能等等不做评价,目前满足需要。
使用方法:
有这么几个概念需要提前知道1.XXCacheFacade,比如如果是oscache,那么XX就是oscachefacade.该类负责缓存的写入和刷出
[code]
<bean id="oscacheFacade" class="org.springmodules.cache.provider.oscache.OsCacheFacade">
<property name="failQuietlyEnabled" value="true"/>
<property name="cacheManager">
<bean id="oscacheManager" class="org.springmodules.cache.provider.oscache.OsCacheManagerFactoryBean"/>
</property>
</bean>
[/code]
里面的cacheManager必须要有,改类负责提供底层具体的cache实现,比如oscache或者EHcache等。
2.MethodMapCachingInterceptor这个拦截器是官方提供的同类型的拦截器之一,根据方法名,参数匹配拦截。
[code]
<bean id="cachingInterceptor001" class="org.springmodules.cache.interceptor.caching.MethodMapCachingInterceptor">
<property name="cacheProviderFacade" ref="oscacheFacade"/>
<property name="cachingModels">
<props>
<prop key="com.company.jncz.TestItIF.get*">groups=aa;refreshPeriod=10</prop>
<prop key="com.company.jncz.TestItIF.load*">groups=bb;refreshPeriod=10</prop>
</props>
</property>
</bean>
[/code]
注意cachingModels。有两种方式写法,一种是上面看到的使用props另一种是使用Map.在有些情况下只能使用Map方式,下面解释
[code]
<map>
<entry key="com.company.jncz.TestIt.get*">
<ref local="oscacheCachingModel"/>
</entry>
</map>
[/code]
[code]
<bean id="oscacheCachingModel" class="org.springmodules.cache.provider.oscache.OsCacheCachingModel">
<property name="groups">
<list>
<value>aa</value>
<value>bb</value>
</list>
</property>
<property name="refreshPeriod" value="10"/>
</bean>
[/code]
尤其当groups(对于oscache来说是groups)的值不止一个的时候,就需要使用map的方式。
否则不生效(也许还有什么我没有注意到).另外需要注意的是对于model来说他的key很重要。有以下需要注意:如果AImpl是A接口的实现类,而且你在其他地方使用时都是用A接口来声明的,那么key就必须写成接口的全限定名比如:com.company.jncz.A.getXX,否则无法识别。
对于与cachingModel相对应的flushingModel写法是类似的,参考api很容易写出来。
最后
[code]
<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="beanNames">
<value>*Service</value>
</property>
<property name="interceptorNames">
<list>
<value>cachingInterceptor001</value>
<value>flushingInterceptor001</value>
</list>
</property>
</bean>
<bean id="testService" class="com.company.jncz.TestItStub"/>
[/code]
这些不做介绍。
总之比较简单。这两天感冒,昏昏沉沉,不知道有没有表达清楚。。。。
自己看了一眼,的确没说清楚,要清楚的几个概念是cacheFacade.CachingModel.FlushingModel.CachingInterceptor.FlushingInterceptor.这些算是比较重要的。其他aop内容略。caching拦截器拦截某方法,根据cachingModel定义的规则由cacheFacade将之放入cache。flushing拦截器拦截到某方法,根据flushingModel定义的规则由cacheFacade将对应的cache清除。嗯,基本上流程就这样子了。
改cache采用了aop的方式进行cache的写入和刷出。使用spring风格,上手容易。
系统负载不高,因此对于该缓存方法的性能等等不做评价,目前满足需要。
使用方法:
有这么几个概念需要提前知道1.XXCacheFacade,比如如果是oscache,那么XX就是oscachefacade.该类负责缓存的写入和刷出
[code]
<bean id="oscacheFacade" class="org.springmodules.cache.provider.oscache.OsCacheFacade">
<property name="failQuietlyEnabled" value="true"/>
<property name="cacheManager">
<bean id="oscacheManager" class="org.springmodules.cache.provider.oscache.OsCacheManagerFactoryBean"/>
</property>
</bean>
[/code]
里面的cacheManager必须要有,改类负责提供底层具体的cache实现,比如oscache或者EHcache等。
2.MethodMapCachingInterceptor这个拦截器是官方提供的同类型的拦截器之一,根据方法名,参数匹配拦截。
[code]
<bean id="cachingInterceptor001" class="org.springmodules.cache.interceptor.caching.MethodMapCachingInterceptor">
<property name="cacheProviderFacade" ref="oscacheFacade"/>
<property name="cachingModels">
<props>
<prop key="com.company.jncz.TestItIF.get*">groups=aa;refreshPeriod=10</prop>
<prop key="com.company.jncz.TestItIF.load*">groups=bb;refreshPeriod=10</prop>
</props>
</property>
</bean>
[/code]
注意cachingModels。有两种方式写法,一种是上面看到的使用props另一种是使用Map.在有些情况下只能使用Map方式,下面解释
[code]
<map>
<entry key="com.company.jncz.TestIt.get*">
<ref local="oscacheCachingModel"/>
</entry>
</map>
[/code]
[code]
<bean id="oscacheCachingModel" class="org.springmodules.cache.provider.oscache.OsCacheCachingModel">
<property name="groups">
<list>
<value>aa</value>
<value>bb</value>
</list>
</property>
<property name="refreshPeriod" value="10"/>
</bean>
[/code]
尤其当groups(对于oscache来说是groups)的值不止一个的时候,就需要使用map的方式。
否则不生效(也许还有什么我没有注意到).另外需要注意的是对于model来说他的key很重要。有以下需要注意:如果AImpl是A接口的实现类,而且你在其他地方使用时都是用A接口来声明的,那么key就必须写成接口的全限定名比如:com.company.jncz.A.getXX,否则无法识别。
对于与cachingModel相对应的flushingModel写法是类似的,参考api很容易写出来。
最后
[code]
<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="beanNames">
<value>*Service</value>
</property>
<property name="interceptorNames">
<list>
<value>cachingInterceptor001</value>
<value>flushingInterceptor001</value>
</list>
</property>
</bean>
<bean id="testService" class="com.company.jncz.TestItStub"/>
[/code]
这些不做介绍。
总之比较简单。这两天感冒,昏昏沉沉,不知道有没有表达清楚。。。。
自己看了一眼,的确没说清楚,要清楚的几个概念是cacheFacade.CachingModel.FlushingModel.CachingInterceptor.FlushingInterceptor.这些算是比较重要的。其他aop内容略。caching拦截器拦截某方法,根据cachingModel定义的规则由cacheFacade将之放入cache。flushing拦截器拦截到某方法,根据flushingModel定义的规则由cacheFacade将对应的cache清除。嗯,基本上流程就这样子了。