<dependency>
<groupId>com.github.qiujiayu</groupId>
<artifactId>autoload-cache</artifactId>
<version>${version}</version>
</dependency>
序列化工具主要用于深度复杂,以及缓存中数据与Java对象的转换。框架中已经实现如下几种序列化工具:
- com.jarvis.cache.serializer.HessianSerializer 基于Hessian2序列化工具
- com.jarvis.cache.serializer.JdkSerializer JDK自带序列化工具
- com.jarvis.cache.serializer.FastjsonSerializer 基于Fastjson序列化工具,使用Fastjson时需要注意:返回值中如果是泛型的话,需要指明具体的类型,比如:List,如果是直接返回List则会出错。
如果希望对比较长的数据进行压缩处理后再传到分布式缓存服务器的话,可以使用com.jarvis.cache.serializer.CompressorSerializer 进行处理。支持GZIP,BZIP2,XZ,PACK200,DEFLATE,等几种压缩算法(默认使用GZIP)。
如果需要使用其它序列化工具,可以通过实现com.jarvis.cache.serializer.ISerializer来扩展(比如:Kryo和FST等)。
<bean id="hessianSerializer" class="com.jarvis.cache.serializer.HessianSerializer" />
<bean id="jdkSerializer" class="com.jarvis.cache.serializer.JdkSerializer" />
<bean id="fastjsonSerializer" class="com.jarvis.cache.serializer.FastjsonSerializer" />
<bean id="hessianCompressorSerializer" class="com.jarvis.cache.serializer.CompressorSerializer">
<constructor-arg ref="hessianSerializer" />
</bean>
缓存Key及一些条件表达式,都是通过表达式与Java对象进行交互的,框架中已经内置了使用Spring El和Javascript两种表达的解析器,分别的:com.jarvis.cache.script.SpringELParser 和 com.jarvis.cache.script.JavaScriptParser,如果需要扩展,需要继承com.jarvis.cache.script.AbstractScriptParser 这个抽象类。
<bean id="scriptParser" class="com.jarvis.cache.script.SpringELParser" />
框架已经支持 Redis、Memcache以及ConcurrentHashMap 三种缓存:
<bean id="cacheHandler" class="com.jarvis.cache.CacheHandler" destroy-method="destroy">
<constructor-arg ref="cacheManager" />
<constructor-arg ref="scriptParser" />
<constructor-arg ref="autoLoadConfig" />
<constructor-arg ref="hessianSerializer" />
</bean>
<bean id="cacheInterceptor" class="com.jarvis.cache.aop.aspectj.AspectjAopInterceptor">
<constructor-arg ref="cacheHandler" />
</bean>
<aop:config proxy-target-class="true">
<!-- 处理 @Cache AOP-->
<aop:aspect ref="cacheInterceptor">
<aop:pointcut id="daoCachePointcut" expression="execution(public !void com.jarvis.cache_example.common.dao..*.*(..)) && @annotation(cache)" />
<aop:around pointcut-ref="daoCachePointcut" method="proceed" />
</aop:aspect>
<!-- 处理 @CacheDelete AOP-->
<aop:aspect ref="cacheInterceptor" order="1000"><!-- order 参数控制 aop通知的优先级,值越小,优先级越高 ,在事务提交后删除缓存 -->
<aop:pointcut id="deleteCachePointcut" expression="execution(* com.jarvis.cache_example.common.dao..*.*(..)) && @annotation(cacheDelete)" />
<aop:after-returning pointcut-ref="deleteCachePointcut" method="deleteCache" returning="retVal"/>
</aop:aspect>
<!-- 处理 @CacheDeleteTransactional AOP-->
<aop:aspect ref="cacheInterceptor">
<aop:pointcut id="cacheDeleteTransactional" expression="execution(* com.jarvis.cache_example.common.service..*.*(..)) && @annotation(cacheDeleteTransactional)" />
<aop:around pointcut-ref="cacheDeleteTransactional" method="deleteCacheTransactional" />
</aop:aspect>
</aop:config>
如果不同的数据,要使用不同的缓存的话,可以通过配置多个AOP来进行共区分。
更多的配置可以参照
autoload-cache-spring-boot-starter 推荐使用这个,test目录中也有可运行例子。
Spring 实例代码,基于Spring XML进行配置
以上配置是基于 Spring 的配置,如果是使用nutz,请参照 AutoLoadCache-nutz 中的说明。