多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
Spring 3.1之后,引入了注解缓存技术,其本质上不是一个具体的缓存实现方案,而是一个对缓存使用的抽象,通过在既有代码中添加少量自定义的各种annotation,即能够达到使用缓存对象和缓存方法的返回对象的效果。Spring的缓存技术具备相当的灵活性,不仅能够使用SpEL(Spring Expression Language)来定义缓存的key和各种condition,还提供开箱即用的缓存临时存储方案,也支持和主流的专业缓存集成。其特点总结如下: * 少量的配置annotation注释即可使得既有代码支持缓存; * 支持开箱即用,不用安装和部署额外的第三方组件即可使用缓存; * 支持Spring Express Language(SpEL),能使用对象的任何属性或者方法来定义缓存的key和使用规则条件; * 支持自定义key和自定义缓存管理者,具有相当的灵活性和可扩展性 和Spring的事务管理类似,Spring Cache的关键原理就是Spring AOP,通过Spring AOP实现了在方法调用前、调用后获取方法的入参和返回值,进而实现了缓存的逻辑。而Spring Cache利用了Spring AOP的动态代理技术,即当客户端尝试调用pojo的foo()方法的时候,给它的不是pojo自身的引用,而是一个动态生成的代理类 ![](https://img.kancloud.cn/e1/da/e1da737275fabe6edb702b90ce7d05bb_591x217.png) Spring Cache主要使用三个注释标签,即@Cacheable、@CachePut和@CacheEvict,主要针对方法上注解使用,部分场景也可以直接类上注解使用,当在类上使用时,该类所有方法都将受影响 | 标签类型 | 作用 | 主要配置参数说明 | | --- | --- | --- | | @Cacheable | 主要针对方法配置,能够根据方法的请求参数对其结果进行缓存 | **value:**缓存的名称,在 Spring 配置文件中定义,必须指定至少一个;**key:**缓存的 key,可以为空,如果指定要按照 SpEL 表达式编写,如果不指定,则默认按照方法的所有参数进行组合;**condition:**缓存的条件,可以为空,使用 SpEL 编写,返回 true 或者 false,只有为 true 才进行缓存 | | @CachePut | 主要针对方法配置,能够根据方法的请求参数对其结果进行缓存,和 @Cacheable 不同的是,它每次都会触发真实方法的调用 | **value:**缓存的名称,在 spring 配置文件中定义,必须指定至少一个;**key:**缓存的 key,可以为空,如果指定要按照 SpEL 表达式编写,如果不指定,则默认按照方法的所有参数进行组合;**condition:**缓存的条件,可以为空,使用 SpEL 编写,返回 true 或者 false,只有为 true 才进行缓存 | | @CacheEvict | 主要针对方法配置,能够根据一定的条件对缓存进行清空 | **value:**缓存的名称,在 Spring 配置文件中定义,必须指定至少一个;**key:**缓存的 key,可以为空,如果指定要按照 SpEL 表达式编写,如果不指定,则默认按照方法的所有参数进行组合;**condition:**缓存的条件,可以为空,使用 SpEL 编写,返回 true 或者 false,只有为 true 才进行缓存;**allEntries:**是否清空所有缓存内容,默认为 false,如果指定为 true,则方法调用后将立即清空所有缓存;**beforeInvocation:**是否在方法执行前就清空,默认为 false,如果指定为 true,则在方法还没有执行的时候就清空缓存,默认情况下,如果方法执行抛出异常,则不会清空缓存 | ### Spring缓存扩展 这需要简单的三步骤 1. 首先需要提供一个CacheManager接口的实现(继承至AbstractCacheManager),管理自身的cache实例; 2. 实现自己的cache实例MyCache(继承至Cache),在这里面引入我们需要的第三方cache或自定义cache; 3. 最后就是对配置项进行声明,将MyCache实例注入CacheManager进行统一管理 【参考资料】 [https://tech.meituan.com/2017/03/17/cache-about.html](https://tech.meituan.com/2017/03/17/cache-about.html)