spring缓存机制-基本原理(五)

来源:互联网 发布:mysql 查看临时表空间 编辑:程序博客网 时间:2024/05/22 13:29
原文链接:http://blog.csdn.net/sidongxue2/article/details/30984555
spring是一个轻量级开源框架,以IoC(Inverse of Control:控制反转)和AOP(Aspect Oriented Programming:面向切面编程)为内核,
兼具功能强大的的原生展现层spring mvc,原生持久层spring jdbc和原生业务层等技术,并且以海纳百川的胸怀整合了开源世界里众多
著名的第三方框架和类库,已经逐渐成为世界上使用最多的JavaEE企业级应用开源框架.
在使用spring缓存技术过程中,我们用到了三种注释@Cacheable、@CachePut和@CacheEvict.
1.@Cacheable作用和配置方法
@Cacheable的作用主要针对方法配置,根据方法的请求参数对其结果进行缓存.
value:缓存的名称,在spring配置文件中定义,必须至少指定一个.例如:@Cacheable(value="cache1")或者@Cacheable(value={"cache1","cache2"}.
key:缓存的key,可以为空,支持使用SpEL编写,如果为空缺省按照方法的所有参数进行组合.例如:@Cacheable(value="cache1",key="#username").
condition:缓存的条件,可以为空,支持使用SpEL编写,如果为空缓存全部数据.例如:@Cacheable(value="cache1",condition="#username.length() > 5").
2.@CachePut作用和配置方法
@CachePut的作用主要针对方法配置,能够根据方法的请求参数对其结果进行缓存,和@Cacheable不同的是,它每次都会触发真实方法的调用.
value:缓存的名称,在spring配置文件中定义,必须至少指定一个.例如:@CachePut(value="cache1")或者@CachePut(value={"cache1","cache2"}.
key:缓存的key,可以为空,支持使用SpEL编写,如果为空缺省按照方法的所有参数进行组合.例如:@CachePut(value="cache1",key="#username").
condition:缓存的条件,可以为空,支持使用SpEL编写,如果为空缓存全部数据.例如:@CachePut(value="cache1",condition="#username.length() > 5").
3.@CacheEvict作用和配置方法
@CachEvict的作用主要针对方法配置,能够根据一定的条件对缓存进行清空.
value:缓存的名称,在spring配置文件中定义,必须至少指定一个.例如:@CachEvict(value="cache1")或者@CachEvict(value={"cache1","cache2"}.
key:缓存的key,可以为空,支持使用SpEL编写,如果为空缺省按照方法的所有参数进行组合.例如:@CachEvict(value="cache1",key="#username").
condition:缓存的条件,可以为空,支持使用SpEL编写,如果为空清空全部缓存数据.例如:@CachEvict(value="cache1",condition="#username.length() > 5").
allEntries:是否清空所有缓存内容,缺省为false,如果为true则方法调用后将立即清空所有缓存例如:@CachEvict(value="cache1",allEntries=true).
beforeInvocation:是否在方法执行前就清空,缺省为false,如果指定为 true则在方法还没有执行的时候就清空缓存,缺省情况下,如果方法执行抛出异常,
则不会清空缓存.例如:@CachEvict(value="cache1",beforeInvocation=true).
通过上面三种注释我们可以轻松的为程序实现缓存,并且不用任何缓存逻辑,那么spring缓存的原理是什么呢?
和spring的事务管理类似,spring cache的关键原理是spring AOP,即在方法调用前,掉用后获取方法的入参和返回值,进而实现缓存的逻辑.
当调用某个未添加缓存注解的服务时,调用者拥有的是被调用者的直接的应用,而spring cache利用了Spring AOP的动态代理技术,
即当给此服务添加缓存注解后,调用者实际拥有的是被调用者的代理引用.当调用代理的方法时,代理可以整体控制实际的方法的入参和返回值.
比如缓存结果,直接跳过执行实际的方法等.
0 0