使用Spring的缓存管理器缓存Web内容

在这篇文章中,我想向您展示如何使用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公开,并且可以通过JMX控制台执行@ManagedOperation注释的方法。 我建议使用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按钮将触发缓存清除。

jmxBeans

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/360021.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学水利的想转行计算机,为什么说千万别学水利水电工程?附水利八大院排名2020年(最新)...

选择科目测一测我能上哪些大学选择科目领取你的专属报告>选择省份关闭请选择科目确定v>水利水电工程一直是国家建设中离不开的一个环节&#xff0c;该专业在父母眼中是也很有前途的专业&#xff0c;但近几年&#xff0c;许多人不太看好水利水电工程专业了&#xff0c;甚至…

【WP8】ResourceDictionary

WP8中引用资源字典 当我们定义的样式太多的时候&#xff0c;我们可以把样式分别定义在不同的文件中&#xff0c;然后通过 MergedDictionaries 应用到其他资源字典中&#xff0c;看下面Demo 我们可以把样式定义在多个文件中&#xff0c;然后再App.xaml中引用 我们先定义三个文件…

python夹角余弦雷达图_雷达导论PART-II.1 无线电波与交变电流信号

今天开始进入第二篇-必要的准备知识&#xff0c;全部的篇章结构见我的第一篇文章“雷达导论 引言”。第二篇有3个章节&#xff0c;如下图所示&#xff0c;分别是第4章-无线电波与交变电流信号、第5章-用一种非数学的方法理解雷达、第6章-雷达的数学预备知识。今天先讲第4章&…

Oracle Java Mission Control:终极指南

“我们喜欢关注Mikhail Vorontsov的博客&#xff0c;并获得他对Java Performance相关问题的看法。 我们曾多次被问到Takipi的Java错误分析与Java Mission Control和Java Flight Recorder有何不同。 因此&#xff0c;尽管工具之间的差异很大&#xff08;主要是&#xff0c;JMC主…

用计算机演奏打上花火,米津玄师打上花火歌词中文谐音(最好要简单全面)

满意答案.Ador2020.03.19采纳率&#xff1a;60% 等级&#xff1a;14已帮助&#xff1a;2446人打上花火 - 《升起的烟花&#xff0c;从下面看&#xff1f;还是从侧面看&#xff1f;》主题曲 词&#xff1a;米津玄师 曲&#xff1a;米津玄师xDAOKO有些地方一些音不对请见谅哈 …

两个向量之间的夹角公式_关于平面向量夹角求参数取值范围的两种基本解法介绍...

平面向量的夹角问题是考察高中向量知识掌握程度的常考内容&#xff0c;主要涉及到的知识点是平面向量的数量积公式。在这里介绍一道常见的平面向量题目&#xff0c;通过两种最基本的解法&#xff0c;来帮助同学们理解向量之间的夹角。填空题第15题&#xff1a;设平面向量a(-2&a…

宿迁学院的计算机系怎么样,宿迁学院是几本 学生评价怎么样好不好(10条)

宿迁学院是几本 学生评价怎么样好不好(10条)考生之前的努力奋斗就是为了高考报志愿时有更多的底气和把握。而俗话说&#xff0c;三分考、七分报&#xff0c;有很多考生和家长都还不太了解大学的一本、二本、三本之分&#xff0c;本科高校只有一个层次和等级&#xff0c;就是(本…

Google Guava:您永远不会知道的5件事

每个开发人员都可以使用哪些鲜为人知的Google Guava功能&#xff1f; 它是那里最受欢迎的库之一&#xff0c;它是开源的&#xff0c;您可能已经知道了&#xff0c;它来自人们玩Quidditch作为一项真正的运动的地方&#xff08;至少在The Internship上 &#xff09;。 它不是哈利…

hql中获取前一天的数据_PostgreSql 怎么获取数据库中关键系统信息(一)

如何通过SQL 的方式获得数据库中的一些关键信息&#xff0c;是一个DB最正常的工作&#xff0c;如何通过一些SQL来获得PG的一些关键的参数和信息或者是数据库中的一些信息是需要知道的一件事情。以下是部分 1一般来说每种数据库中都有一个或几个系统的数据库&#xff0c;在PG中s…

计算机信息技术为教育带来的变化,信息技术对课堂教学带来的变化

信息技术对课堂教学带来的变化谈一谈信息技术对教育教学的影响以及给课堂教学带来的变化龙川县培英学校 骆俊武在信息技术迅速发展的今天&#xff0c;计算机的应用、网络技术应用&#xff0c;直接影响着学校的的教育教学系统、学校的教育模式、教第一文库网师的教学方法。与传统…

abd shell关闭所有程序_一个 Shell 脚本逆袭的规范,拿走不谢

指定一个默认脚本解释器“#!” 是一个约定的标记&#xff0c;它告诉系统这个脚本需要什么解释器来执行&#xff0c;即使用哪一种Shell。他指明了当我们没有指定解释器的时候默认的解释器。为什么建议要在首行加上脚本默认解释器&#xff0c;因为有的操作系统的默认解释器不是sh…

unity 是厘米还是米_1种“竹节参”,植株有40厘米高,能挂果,果子成熟后变红,珍贵...

很多顽强的野生植物会在竹林里生长&#xff0c;我们都知道价值比较高的七叶一枝花、金线莲等植物&#xff0c;就会生长在湿润的竹林里&#xff0c;它们喜欢湿度比较高的环境&#xff0c;所以在其它比较潮湿的地方也有。不过还有1种“竹节参”&#xff0c;它在竹林里也是常见的&…

JS中的三种弹框

1.alert();"弹框提示" 2.confirm();“确认信息”3.prompt();"输入信息"转载于:https://www.cnblogs.com/hr2014/p/3637692.html

python 窗口 网页 访问_同事用Python操控浏览器运行,引的妹子围观不止!

Python可以做的事情很多&#xff0c;小编也正在奋力挖掘中&#xff0c;今天给大家分享一下&#xff0c;如何用Python来控制浏览器的运行及操作&#xff01;嗯 关于这个&#xff0c;大体有两种方式&#xff0c;且听小编一一列举&#xff1a;一、使用系统自带库 os这个方法的话任…

8g可用 安装内存16g_同样是16g内存,为啥都选两条8G,不选16G单条,这难道有啥讲究?...

相信大家在看一些大神的配置&#xff0c;或者蜗牛这种装机小编的配置的时候&#xff0c;发现内存经常是两条8G&#xff0c;而不是一条16G,很多小伙伴也发出了疑问&#xff0c;难道这里面有什么讲究&#xff1f;这就要扯到双通道&#xff0c;一般来说CPU或者主板的内存控制器有两…

Generate GUID using vbscript

在 .msi 中 的 Component table&#xff0c;查看 ComponentId 列&#xff0c;是一个16进制数的字符串&#xff0c; 用 InstallShield IDE 添加一个 component &#xff0c;ComponentId 会自动生成&#xff0c;点击“Generate GUID” 会重新生成一个新的 ComponentId&#xff0c…

ps怎么对比原图快捷键_PS教程:P图前后,你还能认出这是同一个人吗?

编按&#xff1a;PS一直被誉为亚洲四大邪术之一&#xff0c;比如下图你敢相信这是同一个人吗&#xff1f;是不是隐隐约约回忆起了乔碧萝殿下的辉煌&#xff1f;但话说回来&#xff0c;谁不想看到最好的自己呢&#xff1f;今天我们就看看PS如何将人脱胎换骨&#xff0c;学会这招…

第一个被赋予公明身份的机器人_一文读懂机器人的“眼睛”

看过漫威电影的同学都知道&#xff0c;钢铁侠在装甲里一眨眼&#xff0c;就通过眼球追踪操控人机互动&#xff0c;集黑科技于一身的装备简直不要太炫酷。如今&#xff0c;我们再回头看钢铁侠的AI识别系统&#xff0c;不禁思考这背后的视觉技术。如何让机器人像人类一样获取视觉…

太和二中计算机考试,安徽省太和二中高二数学下册期末考试试题精选

安徽省太和二中高二数学下册期末考试试题精选一.选择题(50分)1.设 是两条不同的直线, 是两个不同的平面,下列命题中正确的是( D )A . 若 , , ,则 B.若 , , ,则C.若 , , ,则 D.若 , , ,则2. 若 &#xff0c;则函数 的两个零点分别位于区间( A )A. 和 内 B. 和 内 C. 和 内 D. 和…

git获取本地版本号_Git使用小结

Git1.Git介绍Git是一个开源的分布式版本控制系统&#xff0c;是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件&#xff0c;Git可以使用本地创建仓库与网络仓库&#xff0c;解决了集中管理型版本控制软件存在的一些问题(CVS、VSS、SVN)。2.Gi…