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;选修课必逃”。不知道大家是…

自动化运维 python 批量监控服务器_1、python自动化运维——监测服务器状态

监测服务器状态 获取系统性能信息 1、CPU信息&#xff1a; Linux操作系统的CPU利用的几个部分&#xff1a; User Time;SystemTime;Wait IO;Idle psutil.cpu_times() psutil.cpu_times().user psutil.cpu_count() 2、内存信息 psutil.virtual_memory() #查看内存完整信息 psutil…

计算机应用基础模拟三答案,《计算机应用基础》模拟试卷三答案

计算机应用基础计算机应用基础 模拟试卷三模拟试卷三 答案答案 得分评卷人 一一 填空题填空题 1 HTTP 2 采样频率 3 机械 光电 光学 4 文件夹 5 TCP IP 6 网卡 7 网络地址 8 光纤 9 应用 10 左下角 标签颜色为白色 11 第一步 打开 页面设置 在 页边距 选项卡中选择横向 然后在 …

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

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

ginkgo spi 错误_开发SPI时不要犯这个错误

ginkgo spi 错误您的大多数代码都是私有的&#xff0c;内部的&#xff0c;专有的&#xff0c;并且永远不会公开。 在这种情况下&#xff0c;您可以放轻松–您可以重构所有错误&#xff0c;包括那些可能导致API更改中断的错误。 但是&#xff0c;如果要维护公共API&#xff0c;…

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…

计算机课实验三,成都信息工程学院计算机网络课程实验三

成都信息工程学院计算机网络课程实验三 本文关键词&#xff1a;成都&#xff0c;计算机网络&#xff0c;信息工程学院&#xff0c;课程&#xff0c;实验成都信息工程学院计算机网络课程实验三 本文简介&#xff1a;计算机网络实验报告实验三&#xff1a;编写客户服务器程序班级…

C语言#define与typedef的区别

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

netflix_Netflix Archaius用于物业管理–基础知识

netflixNetflix Archaius提供了一组精巧的功能&#xff0c;可将动态属性加载到应用程序中。 这篇博客文章只是我所了解的Archaius范围的文档&#xff0c;比我在这里所记录的内容要多得多&#xff0c;但这应该提供一个很好的开始&#xff1a; 默认行为 考虑一个简单的属性文件…

python安装pygame模块_windows下 python 如何安装pygame模块

本机系统&#xff1a;win7&#xff0c;Pyhon版本&#xff1a; 3.6.0 1. 安装下载python 官网 https://www.python.org/ 下载地址 https://www.python.org/downloads/windows/ 下载后运行并安装。注意&#xff1a; 官网明确表示&#xff0c;3.5及以上版本不支持xp操作系统。要兼…

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;下面将用第一视角一起探究这其中的…

arm926ej_EJB超时策略:它们如何提供帮助?

arm926ejEJB 3.1在其API中引入了与超时相关的注释。 AccessTimeout StatefulTimeout 让我们快速看一下它们是什么以及它们为什么重要 AccessTimeout 指定一个排队请求&#xff08;等待另一个线程完成&#xff09;超时的时间段。 当您的会话bean实例被并发请求轰炸时&#…

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 …