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

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按钮将触发缓存清除。

jmxBeans

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

spring默认缓存管理器

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

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

相关文章

计算机软件选修课选什么好,大学值得选的“选修课”,一点不比专业课差,能选上最好认真听...

原标题&#xff1a;大学值得选的“选修课”&#xff0c;一点不比专业课差&#xff0c;能选上最好认真听文/小哈你是怎样对待你的选修课的&#xff1f;以前经常听学长学姐们说过这样一句话&#xff0c;“上大学之后&#xff0c;专业课选逃&#xff0c;选修课必逃”。不知道大家是…

C/C++程序员的编程修养

点击蓝字关注我们什么是好的C/C程序员&#xff1f;是不是懂得很多技术细节&#xff1f;还是懂底层编程&#xff1f;还是编程速度比较快&#xff1f;我觉得都不是。对于一些技术细节来说和底层的技术&#xff0c;只要看帮助&#xff0c;查资料就能找到&#xff0c;对于速度快&am…

python账号密码一一对应_python模拟用户登录系统,如何两个用户输入各自的密码才能登入?...

展开全部 #我可以把我自己2113的成果送你&#xff0c;你来研究5261研究 import json #用来存储数据4102的模块 import os #用来进行文件操作1653 import sys #获取脚本所在目录用 import re #用来进行字符串操作 script_path os.path.realpath(__file__) PATH os.path.dirnam…

C语言#define与typedef的区别

点击蓝字关注我们在C语言编程中&#xff0c;typedef 和 #define是最常用语句&#xff0c;可能很多工作过几年的工程师都没有去深究过它们的一些用法和区别。typedef的用法在C/C语言中&#xff0c;typedef常用来定义一个标识符及关键字的别名&#xff0c;它是语言编译过程的一部…

html文字添加波浪线,利用css渐变给文字下方加波浪线

具体代码如下.wavy-line-decoration {position: relative;line-height: 1.5em;}.wavy-line-decoration::before {content: ;position: absolute;bottom: -3px;width: 100%;height: 0.25em;background: // 可以给同一个元素同时添加多个背景渐变图层&#xff0c;用逗号隔开&…

新旧C++生成随机浮点数方法,你喜欢哪个?

点击蓝字关注我们一、在C11之前&#xff0c;我们通常采用rand函数来生成随机数。有时我们想用rand生成一组随机数&#xff0c;即使我们调用了srand&#xff0c;但生成的还是相同值。为什么会产生这种情况&#xff1f;又该如何解决&#xff1f;下面将用第一视角一起探究这其中的…

html页面加载完成后会触发的事件_前端隐秘角落 - 页面渲染

前言如图所示&#xff0c;webkit内核浏览器的渲染过程(解析HTML&#xff0c;构建DOM树&#xff0c;解析CSS&#xff0c;构建CSSOM树 &#xff0c;构建render树&#xff0c;布局layout&#xff0c;绘制painting)&#xff0c;这些过程理解起来可能有些抽象&#xff0c;今天我们一…

计算机进管理提示找不到入口,win10系统开机提示xxxdll模块已加载但找不到入口点的教程...

有关win10系统开机提示xxxdll模块已加载但找不到入口点的操作方法想必大家有所耳闻。但是能够对win10系统开机提示xxxdll模块已加载但找不到入口点进行实际操作的人却不多。其实解决win10系统开机提示xxxdll模块已加载但找不到入口点的问题也不是难事&#xff0c;小编这里提示两…

十大经典排序,你真的都会了吗?(源码详解)

点击蓝字关注我们一、前言&#xff1a;排序的概念排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。稳定性&#xff1a;假定在待排序的记录序列中&#xff0c;存在多个具有相同的关键…

jvm 架构_不可变的基础架构,热部署和JVM

jvm 架构您是否在生产中部署和取消部署基于JVM的应用程序&#xff08;无论JVM容器/无容器&#xff09;&#xff1f; 也就是说&#xff0c;当您拥有某个应用程序或服务的新版本时&#xff0c;是否通过“取消部署”和“热部署”该应用程序的新更新版本来更改正在运行的JVM&#x…

c语言默认参数_5.1 C++有默认参数的函数

点击上方“C语言入门到精通”&#xff0c;选择置顶第一时间关注程序猿身边的故事作者闫小林白天搬砖&#xff0c;晚上做梦。我有故事&#xff0c;你有酒么&#xff1f;C有默认参数的函数在函数调用时形参从实参获取值&#xff0c;因为实参的个数要和形参相同&#xff0c;但有时…

计算机组成原理唐朔飞课后答案第六章,计算机组成原理第六章部分课后题答案(唐朔飞版)...

计算机组成原理第六章部分课后题答案(唐朔飞版) 6.4 设机器数字‎长为8位(含1位符号‎位在内)&#xff0c;写出对应下‎列各真值的‎原码、补码和反码‎。 -13/64&#xff0c;29/128&#xff0c;100&#xff0c;-87 解&#xff1a;十进制数 二进制数 原 码 反 码 补 码 -13/64 …

jboss eap 7.0_是时候抛弃Java 7 – JBoss EAP 6.4了!

jboss eap 7.0这一周真是太棒了。 JBoss EAP 6.4已发布&#xff0c;在众多技术增强和新功能中 &#xff0c;最大的是&#xff1a;Java 8已添加到受支持的配置列表中。 其中包括Oracle JDK和IBM JDK。 Java SE 7公开更新结束通知 2015年4月之后&#xff0c;Oracle将不再将Java …

C语言史上最愚蠢的BUG ???

点击蓝字关注我们本文来自“The most stupid C bug ever”&#xff0c;很有意思&#xff0c;分享给大家。我相信这样的bug&#xff0c;就算你是高手你也会犯的。你来看看作者犯的这个Bug吧。。首先&#xff0c;作者想用一段程序来创建一个文件&#xff0c;如果有文件名的话&…

python 字符串转日期_我总结的130页Python与机器学习之路V1.2.pdf,都是干货!

告别枯燥&#xff0c;通过学习有趣的小例子&#xff0c;扎实而系统的入门Python&#xff0c;从菜鸟到大师&#xff0c;个人觉得这是很靠谱的一种方法。通过一个又一个的小例子&#xff0c;真正领悟Python之强大&#xff0c;之简洁&#xff0c;真正做到高效使用Python.两周前发出…

大学计算机需要论文吗,大一新生刚开学,是否有必要带电脑?听听辅导员的建议,非常中肯...

原标题&#xff1a;大一新生刚开学&#xff0c;是否有必要带电脑&#xff1f;听听辅导员的建议&#xff0c;非常中肯各大高校的录取工作正在如火如荼的进行&#xff0c;很快考生们就能接到来自各个学校的录取通知书。对于考生来说&#xff0c;没有什么事情会比被心仪的大学录取…

计算机系统是连续系统,连续系统的计算机模拟

连续系统的计算机模拟 (36页)本资源提供全文预览&#xff0c;点击全文预览即可全文预览,如果喜欢文档就下载吧&#xff0c;查找使用更方便哦&#xff01;29.9 积分&#xfeff; 第2章 连续系统的计算机模拟本章讨论连续系统的模拟技术,由于这类系统中状态随时间连续动态地变化&…

ae合成设置快捷键_教程|AE教程第三波:必须掌握的关键帧之基础设置

该如何高效的学习AE&#xff1f;星驰君认为知其然还需知其所以然正确的学习顺序应该是了解核心原理&#xff0c;掌握基本操作&#xff0c;案例实战模仿比如&#xff0c;想要更好的掌握和运用关键帧来制作更复杂的效果。就先要知道关键帧是什么关键帧&#xff1a;计算机动画术语…

老兵精讲:高质量C语言编程的10条规范

点击蓝字关注我们C语言编码规范10条分享给大家&#xff0c;还是可以规避掉很多bug的&#xff01;1、最重要的规则编写代码时最重要的一条规则是&#xff1a;检查周围的代码并尝试模仿它。作为维护人员&#xff0c;如果收到的补丁明显与周围代码的编码风格不同&#xff0c;这是令…

springboot需要tomcat服务器吗_SpringBoot学习(二):内嵌服务器引擎(Tomcat,Jetty)实现原理...

概述SpringBoot使用main方法启动的一个重要特性是&#xff0c;不需要打包成war部署到Tomcat这种Servlet容器中&#xff0c;而是只需打包成jar&#xff0c;然后通过java或mvn等命令运行这个jar包&#xff0c;然后应用就可以在指定的端口监听客户端的连接请求了。在SpringBoot内部…