本文将带你了解如何使用 Spring Cache 来提高系统性能。
Spring 提供的核心缓存抽象位于 spring-context 模块中。
另外,还有一个名为 spring-context-support 的模块,它位于 spring-context 模块之上,并提供了更多由 EhCache 或 Caffeine 支持的 。如果想使用这些模块作为缓存存储,则需要使用 spring-context-support 模块:
由于 spring-context-support 模块临时依赖于 spring-context 模块,因此 spring-context 不需要单独的依赖声明。
如果是 Spring Boot 项目,可以利用 spring-boot-starter-cache Starter 来轻松添加缓存依赖项:
该 Starter 包含了 spring-context-support 模块。
只需在任何配置类中添加 注解,即可启用缓存功能:
当然,也可以通过 XML 配置来启用缓存:
注意:启用缓存后,必须注册一个 ,这是最基本的设置。
在使用 Spring Boot 时,只需在 classpath 上存在 Starter 依赖,并且与 注解一起使用,就会注册相同的 ,因此不需要单独的 Bean 声明。
还可以使用一个或多个 Bean 来自定义 自动配置 的 :
自动配置会获取到这些 Customizer,并在完成初始化之前将其应用到当前的 中。
启用缓存后,下一步就是通过声明性注解将缓存行为绑定到方法上。
为方法启用缓存行为的最简单方法是用 对其进行注解,它会将方法返回结果存储在注解指定的缓存中:
调用将首先检查缓存 addresses,然后才实际调用该方法并缓存结果。
虽然在大多数情况下一个缓存就足够了,但 Spring 也支持传递多个缓存:
在这种情况下,如果任何缓存中包含所需的结果,就会返回该结果,而不会调用该方法。
缓存的数据如果不进行清理,会保留大量陈旧或未使用甚至是过期的数据。
可以使用 注解来表示删除一个、多个或所有的值,以刷新缓存:
如上,使用参数 与要清空的缓存结合使用;这将清除缓存 addresses 中的所有条目。
使用 注解,可以更新缓存的内容,而不会影响方法的执行。也就是说,方法始终会被执行并将结果缓存起来:
和 的区别在于, 会跳过运行方法,而 会实际运行方法,然后将结果放入缓存。
如果想使用同一类型的多个注解来缓存一个方法,该怎么办?
来看一个错误的例子:
上述代码无法编译,因为 Java 不允许为一个给定的方法声明多个相同类型的注解。
解决上述问题的办法是:
如上面的代码片段所示,可以用 对多个缓存注解进行分组,并用它来实现自己定制的缓存逻辑。
通过 注解,可以将部分缓存配置精简到类级的一个地方,这样就不必多次声明了:
有时,缓存并不是在所有情况下都适用于某种方法。
重用 注解中的示例,这会既执行方法,又缓存结果。
如果想对注解激活的条件进行更多控制,可以用 参数定义一个 SpEL 表达式,框架会根据该表达式的计算结果进行缓存:
在 表达式中可以通过 访问方法参数。
还可以通过 参数,根据方法的返回值而不是参数值来控制缓存:
除非返回的地址短于 64 个字符,否则上述注解将缓存地址。
和 参数可与所有缓存注解结合使用。
事实证明,这种条件缓存对管理大型结果非常有效。它还有助于根据方法参数自定义行为,而不是对所有操作强制执行通用行为。
如果无法访问应用的源码,或者想从外部注入缓存行为,也可以使用基于 XML 的声明式缓存。
XML 配置如下:
下面是相应的 Java 配置:
如下:
本文介绍了如何使用 Spring Cache 抽象来实现声明式缓存以及如何通过缓存注解的 和 属性来灵活地控制缓存条件。
Ref:
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.bianchenghao6.com/java-jiao-cheng/15611.html