spring默认缓存管理器

在这篇文章中,我想向大家展示如何使用Spring的CacheManager,@ Cacheable和JMX批注来缓存和管理Web内容的缓存的基础知识。 想象一下一个网上商店,它从远程WCMS(Web内容管理系统)获取一些内容,例如页眉,页脚,预告片,主导航。 提取可以例如经由REST服务发生。 一些内容很少更新,因此出于性能原因,将其缓存在Web应用程序中是有意义的。

入门

首先,我们需要一个缓存提供程序。 一个好的缓存提供程序将是EhCache 。 您需要将EhCache 作为依赖项添加到您的项目中。 您还需要配置ehcache.xml,该文件除其他事项外还描述缓存名称,缓存内容的存储位置和存储时间。 请参考文档以了解ehcache.xml的外观。 EhCache的中心类是net.sf.ehcache.CacheManager。 借助此类,您可以以编程方式向缓存中添加对象或从缓存中删除任何对象。 可以将对象缓存在内存中,磁盘上或其他位置。

Spring框架提供了一个由EhCache支持的CacheManager – org.springframework.cache.CacheManager。 它还提供了@Cacheable批注。 在文档中 :“顾名思义,@ Cacheable用来划分可缓存的方法-即,将结果存储在缓存中的方法,以便后续调用(具有相同参数)时使用缓存中的值返回,而不必实际执行该方法。 在最简单的形式中,注释声明要求与被注释方法关联的缓存名称。 我们还将使用JMX注释。 这些是Spring的注释@ManagedResource和@ManagedOperation。 我们为什么需要那些? 我们需要它们能够通过JMX控制台清除缓存。 为什么? 好吧,例如,基础数据已更改,但缓存尚未过期。 过时的数据仍将从缓存中读取,而不是从本机源中读取。 用@ManagedResource注释的Bean将作为JMX Bean公开,通过@ManagedOperation注释的方法可以通过JMX控制台执行。 我建议使用JMiniX作为简单的JMX入口点。 只需声明一个servlet,即可将JMiniX嵌入到webapp中。 还支持参数化方法,因此您甚至可以为方法的参数输入一些实际值,并使用这些值触发执行。

怎么做…

现在我们准备开发第一个代码。 我们需要与远程后端进行通信的服务,以便从WCMS中获取各种内容。 让我们用一种方法fetchMainNavigation()展示示例性的基本代码。 此方法获取主导航菜单的结构,并将该结构转换为DTO对象NavigationContainerDTO(菜单的模型类)。 整个业务和技术逻辑都驻留在bean MainNavigationHandler中。 此逻辑对于此博客文章并不重要。 方法fetchMainNavigation()需要两个参数:语言环境(例如,英语或德语)和变量(例如,B2C或B2B shop)。

@Component
public class WCMSServiceImpl extends BaseService implements WCMSService {// injection of Spring's CacheManager is needed for @Cacheable@Autowiredprivate CacheManager cacheManager;@Autowiredprivate MainNavigationHandler mainNavigationHandler;...@Override@Cacheable(value = "wcms-mainnavigation",key = "T(somepackage.wcms.WCMSBaseHandler).cacheKey(#root.methodName, #root.args[0], #root.args[1])")public NavigationContainerDTO fetchMainNavigation(Locale lang, String variant) {Object[] params = new Object[0];if (lang != null) {params = ArrayUtils.add(params, lang);}if (variant != null) {params = ArrayUtils.add(params, variant);}return mainNavigationHandler.get("fetchMainNavigation", params);}
}

该方法使用Spring的@Cacheable注释进行注释。 这意味着,如果返回的对象NavigationContainerDTO在缓存中尚不可用,则将对其进行缓存。 下次提取将从缓存中返回对象,直到缓存过期。 根据ehcache.xml中的设置进行缓存。 Spring的CacheManager在类路径中自动找到EhCache提供程序。 @Cacheable中的value属性指向缓存名称。 key属性指向可以访问对象的缓存中的键。 由于缓存本质上是键值存储,因此对缓存方法的每次调用都需要转换为适合缓存访问的键。 在简单的情况下,键可以是任何静态字符串。 在该示例中,我们需要一个动态键,因为该方法具有两个参数:语言环境和变量。 幸运的是,Spring支持带有SpEL表达式(Spring EL表达式)的动态键。 有关更多详细信息,请参见表“ Cache SpEL可用的元数据 ”。 您可以调用任何生成密钥的静态方法。 我们的表达式T(somepackage.wcms.WCMSBaseHandler).cacheKey(#root.methodName,#root.args [0],#root.args [1])表示我们使用以下三个参数在类WCMSBaseHandler中调用静态方法cacheKey:方法名称,第一个和第二个参数(分别是语言环境和变量)。 这是我们的密钥生成器。

public static String cacheKey(String method, Object... params) {StringBuilder sb = new StringBuilder();sb.append(method);if (params != null && params.length > 0) {for (Object param : params) {if (param != null) {sb.append("-");sb.append(param.toString());}}}return sb.toString();
}

让我们展示处理程序类MainNavigationHandler的外观。 这只是来自实际项目的简化示例。

@Component
@ManagedResource(objectName = "bean:name=WCMS-MainNavigation",description = "Manages WCMS-Cache for the Main-Navigation")
public class MainNavigationHandler extends WCMSBaseHandler<NavigationContainerDTO, Navigation> {@OverrideNavigationContainerDTO retrieve(Objects... params) {// the logic for content retrieving and DTOs mapping is placed here...}@ManagedOperation(description = "Delete WCMS-Cache")public void clearCache() {Cache cache = cacheManager.getCache("wcms-mainnavigation");if (cache != null) {cache.clear();}}
}

由于在WCMSBaseHandler中进行了以下注入,因此CacheManager在这里也可用。

@Autowired
private CacheManager cacheManager;

@ManagedResource是Spring的JMX批注,以便将bean作为JMX MBean导出并在JMX控制台中可见。 导出的方法应使用@ManagedOperation注释。 这是方法clearCache(),它从缓存中删除主导航的所有内容。 “所有内容”是指NavigationContainerDTO类型的对象。 现在可以将开发的WCMS服务注入前端的Bean中。 我已经在博客上写过如何用纯HTML构建多级菜单并显示了代码。 这正是该服务的主要导航。

还有更多…

应该在Spring的XML配置文件中配置JMX注释的扫描。

<bean id="exporter" class="org.springframework.jmx.export.MBeanExporter"><property name="server" ref="mbeanServer"/><property name="assembler" ref="assembler"/><property name="namingStrategy" ref="namingStrategy"/><property name="autodetect" value="true"/>
</bean>

可在http(s)://:/ mct / webshop / admin / jmx /下访问JMiniX的JMX控制台。单击clearCache()方法的execute按钮将触发缓存清除。

翻译自: https://www.javacodegeeks.com/2015/04/caching-of-web-content-with-springs-cache-manager.html

spring默认缓存管理器

spring默认缓存管理器_使用Spring的缓存管理器缓存Web内容相关推荐

  1. CAD图纸管理软件_强大的CAD图纸管理软件

    CAD图纸管理软件_强大的CAD图纸管理软件 有很多种CAD图纸管理软件可供选择,以下是一些常见的选项: 1.AutoCAD:AutoCAD是一种流行的CAD软件,它具有强大的图纸管理功能,可以方便地 ...

  2. 清空缓存的命令_超详细的mysql数据库查询缓存原理解析、涉及命令、流程分析等...

    概述 mysql查询缓存在数据库优化可以起到很大的作用,今天主要针对这一块做一个总结,下面一起来看看吧~ 一.缓存条件,原理 MySQL Query Cache是用来缓存我们所执行的SELECT语句以 ...

  3. mysql 事件调度器_【MySQL】事件调度器 (Event Scheduler)

    一 event 介绍 事件调度器是定时触发执行的,在这个角度上也可以称作是"临时的触发器".触发器只是针对某个表产生的事件执行一些语句,而事件调度器则是在某一个(间隔)时间执行一些 ...

  4. mysql的事件探查器_用SQL Server事件探查器创建跟踪

    SQL Server事件探查器(Profiler)可以帮助数据库管理员跟踪SQL Server数据库所执行的特定事件,监视数据库的行为;并将这些有价值的信息保存到文件或表,以便以后用来分析解决数据库出 ...

  5. 自定义音频播放器_创建自定义HTML5音频播放器

    自定义音频播放器 在本教程中,我将向您介绍HTML5音频,并向您展示如何创建自己的播放器. 如果您想走捷径,请查看Envato市场上可用的现成的HTML5音频播放器 . 它使您可以从各种来源创建播放列 ...

  6. mongodb可视化管理工具_对我来说数据库图形化管理工具用这个足够了

    1. 前言 我是一个有软件洁癖的人,能用现有的软件解决问题的绝不安装新的软件.Java后端开发主要跟数据库打交道,所以数据库图形化界面(GUI)是少不了的.通常图形化操作关系型数据库(RMDBS)大多 ...

  7. 账号管理工具_全新微信个人号管理工具能选择吗?为何这么说?

    点击上方"蓝字"关注我们 伴随着微信营销的重要性越来越高,很多企业的新媒体运营人员也开始把注意力都放到了微信账号的运营上,不仅是公众号的发展和运营,个人号在这个过程中也是非常重要的 ...

  8. docker 管理工具_详解Docker可视化管理工具shipyard--部署教程及功能展示

    概述 谈及docker,避免不了需要熟练的记住好多命令及其用法,对于熟悉shell.技术开发人员而言,还是可以接受的,熟练之后,命令行毕竟是很方便的,便于操作及脚本化.但对于命令行过敏.非技术人员,进 ...

  9. epub 阅读器_全球与中国EPUB阅读器市场深度调研分析报告

    QYResearch预测:2020-2026全球与中国EPUB阅读器市场现状及未来发展趋势 [纸版价格]:RMB 18000 [电子版(PDF)价格]:RMB 18000 [报告篇幅]:103 [报告 ...

最新文章

  1. redisson的锁的类型_绝对干货:利用redisson完成分布式锁功能
  2. 改编码格式_编码不规范,同事真的会两行泪?
  3. java 多进程写一个文件_java高并发多线程及多进程同时写入文件研究
  4. TIP 2019开源论文:基于深度学习的HEVC多帧环路滤波方法
  5. 從三種方式看SQL的使用程度
  6. Magento--修改已存在的订单的运费
  7. Android Xml布局常见问题总结
  8. 说到项目管理软件,不得不提的是禅道和JIRA
  9. selenium爬取拉钩网数据
  10. 谈谈百度竞价的一些思路
  11. DropBox系列-安卓DropBox介绍
  12. 常用的PHP加密方式
  13. SQL的常见函数的使用方法和举例说明
  14. 决手动打开凭据管理器报0x80070005错误的问题-CMD方式
  15. Dongxiexidu
  16. python怎么同时对多行代码进行注释?
  17. 哪个服务器便宜又稳定,便宜又稳定的云服务器
  18. 全球认可的PMI认证体系
  19. 聚类,k-mean方法,基于密度的方法:DBSCAN,孤立点检测——数据分析与R语言 Lecture 10
  20. 香港服务器 微信支付,如何给微信开通香港钱包(WeChat Pay HK)

热门文章

  1. 动态规划训练24 [Phalanx HDU - 2859 ]
  2. 漫画:如何用栈实现队列
  3. 在Eclipse中使用JUnit4进行单元测试(初级篇)
  4. 你真的了解Java中的三目运算符吗
  5. 深度分析Java的ClassLoader机制(源码级别)
  6. mysql添加新用户
  7. Nodejs第一讲记录
  8. 《四世同堂》金句摘抄(十五)
  9. ssm中spring mvc找不到控制器,报错404
  10. React向对象数组进行赋值