您的位置:首页 > 编程语言 > Java开发

Spring Cache

2016-03-02 19:09 357 查看
Spring 3.1 引入了激动人心的基于注释(annotation)的缓存(cache)技术,它本质上不是一个具体的缓存实现方案(例如EHCache 或者 OSCache),而是一个对缓存使用的抽象,通过在既有代码中添加少量它定义的各种 annotation,即能够达到缓存方法的返回对象的效果。

Spring 的缓存技术还具备相当的灵活性,不仅能够使用 SpEL(Spring Expression Language)来定义缓存的 key 和各种 condition,还提供开箱即用的缓存临时存储方案,也支持和主流的专业缓存例如 EHCache 集成。

其特点总结如下:
通过少量的配置 annotation 注释即可使得既有代码支持缓存
支持开箱即用 Out-Of-The-Box,即不用安装和部署额外第三方组件即可使用缓存
支持 Spring Express Language,能使用对象的任何属性或者方法来定义缓存的 key 和 condition
支持 AspectJ,并通过其实现任何方法的缓存支持
支持自定义 key 和自定义缓存管理者,具有相当的灵活性和扩展性

<!-- 启用缓存注解功能(请将其配置在Spring主配置文件中) -->    

<cache:annotation-driven cache-manager="cacheManager"/>    

<!-- Spring自己的基于java.util.concurrent.ConcurrentHashMap实现的缓存管理器(该功能是从Spring3.1开始提供的) -->    

<!--     

<bean id="cacheManager" class="org.springframework.cache.support.SimpleCacheManager">    

    <property name="caches">    

        <set>    

            <bean name="myCache" class="org.springframework.cache.concurrent.ConcurrentMapCacheFactoryBean"/>    

        </set>    

    </property>    

</bean>    

 -->    

<!-- 若只想使用Spring自身提供的缓存器,则注释掉下面的两个关于Ehcache配置的bean,并启用上面的SimpleCacheManager即可 -->    

<!-- Spring提供的基于的Ehcache实现的缓存管理器 -->    

<bean id="cacheManagerFactory" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">    

    <property name="configLocation" value="classpath:ehcache.xml"/>    

</bean>    

<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager">    

    <property name="cacheManager" ref="cacheManagerFactory"/>    

</bean> 


@Cachea
db91
ble、@CachePut、@CacheEvict 注释介绍

@Cacheable 主要针对方法配置,能够根据方法的请求参数对其结果进行缓存
@CachePut 主要针对方法配置,能够根据方法的请求参数对其结果进行缓存,和 @Cacheable 不同的是,它每次都会触发真实方法的调用
-@CachEvict 主要针对方法配置,能够根据一定的条件对缓存进行清空
如果对象的方法是内部调用(即 this 引用)而不是外部引用,则会导致 proxy 失效,那么我们的切面就失效,也就是说上面定义的各种注释包括 @Cacheable、@CachePut 和 @CacheEvict 都会失效

@CacheEvict
 注释有一个属性 
beforeInvocation
,缺省为
false,即缺省情况下,都是在实际的方法执行完成后,才对缓存进行清空操作。期间如果执行方法出现异常,则会导致缓存清空不被执行。

和内部调用问题类似,非
public 方法如果想实现基于注释的缓存,必须采用基于 AspectJ 的 AOP 机制  

Spring
Cache无效的问题以及解决办法

@Cacheable标注的方法,如果其所在的类实现了某一个接口,那么该方法也必须出现在接口里面,否则cache无效。
具体的原因是, Spring把实现类装载成为Bean的时候,会用代理包装一下,所以从Spring Bean的角度看,只有接口里面的方法是可见的,其它的都隐藏了,自然课看不到实现类里面的非接口方法,@Cacheable不起作用。

解决办法很简单,把待cache的方法移到接口里面。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  缓存 spring cache