Spring 的缓存技术还具备相当的灵活性,不仅能够使用 SpEL(Spring Expression Language)来定义缓存的 key 和各种 condition,还提供开箱即用的缓存临时存储方案,也支持和主流的专业缓存例如 EHCache 集成。
<!-- Cache key generator --> <bean id="keyGenerator" class="com.fcore.common.cache.SignatureKeyGenerator" />
<!-- Cache manager --> <bean id="cacheManager" class="org.springframework.cache.support.SimpleCacheManager"> <property name="caches"> <set> <bean class="com..fcore.common.cache.RedisCache"> <property name="name" value="${accg.cache.name}" /> <property name="ttl" value="${accg.cache.ttl}"></property> </bean> <bean class="com.fbu.fcore.common.cache.RedisCache"> <property name="name" value="${daycut.cache.name}" /> <property name="ttl" value="${daycut.cache.ttl}"></property> </bean> </set> </property> </bean>
SimpleCacheManager配置
<!-- Cache interceptor & Advisor --> <bean id="annotationCacheOperationSource" class="org.springframework.cache.annotation.AnnotationCacheOperationSource" /> <bean id="cacheInterceptor" class="com.common.cache.SignatureCacheInterceptor"> <property name="cacheManager" ref="cacheManager"></property> <property name="keyGenerator" ref="keyGenerator"></property> <property name="cacheOperationSources" ref="annotationCacheOperationSource"></property> </bean> <bean id="beanFactoryCacheOperationSourceAdvisor" class="org.springframework.cache.interceptor.BeanFactoryCacheOperationSourceAdvisor"> <property name="order" value="10"></property> <property name="adviceBeanName" value="cacheInterceptor"></property> <property name="cacheOperationSource" ref="annotationCacheOperationSource"></property> </bean>
BeanFactoryCacheOperationSourceAdvisor
里面有一个叫CacheOperationSourcePointcut的pointcut,用来匹配方法是否需要走拦截器。只有被CacheOperationSourcePointcut匹配的方法才会被拦截,并且通过attributeCache做了缓存。
CacheOperation定义了缓存应该如何实施
通过调用之前注入进去的cacheOperationSources.getCacheOperations获取CacheOperation。其中根据 getCacheOperations获得cacheOperations后调用的execute是关键,其中getCacheOperationSource即是之前说到的bean里面的cacheOperationSources,也就是org.springframework.cache.annotation.AnnotationCacheOperationSource,它负责三个标签的调用:@Cacheable、@CachePut和@CacheEvict。