在这篇文章中,我想向您展示如何使用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按钮将触发缓存清除。

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

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

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

    spring默认缓存管理器 在这篇文章中,我想向大家展示如何使用Spring的CacheManager,@ Cacheable和JMX批注来缓存和管理Web内容的缓存的基础知识. 想象一下一个网上商店 ...

  2. Spring Cache抽象-缓存管理器

    概述 SimpleCacheManager NoOpCacheManager ConcurrentMapCacheManager CompositeCacheManager 概述 CacheManag ...

  3. java缓存管理器_使用@EnableCaching的Spring Boot默认缓存管理器

    我在SpringBootApplication中实现了缓存,如下所示 @SpringBootApplication @EnableCaching public class SampleApplicat ...

  4. Spring 的缓存管理器 CacheManager

    Spring 的缓存管理器 在 spring 项目中提供了CacheManager接口来定义缓存管理器,这样各个不同的缓存就可以实现它来提供管理器的功能了,在spring-boot-starter-d ...

  5. http缓存管理器_小心缓存管理器

    http缓存管理器 如果使用spring和JPA,则很有可能利用ehcache(或其他缓存提供程序). 您可以在两种不同的情况下进行此操作:JPA 2级缓存和spring方法缓存. 配置应用程序时,通 ...

  6. springboot缓存管理器(CacheManager)

    springboot缓存管理器(CacheManager)讲解--超详细!!! 一.引入 ​随着java的慢慢学习,缓存的使用也越来越多.我们使用缓存大多数是通过api的方式来操作,厉害的人也可以自己 ...

  7. springboot2的redis缓存管理器cacheManager配置,使存入json格式数据

    springboot中默认存入缓存的数据,使用的序列化方案对应的值不方便查看,我们希望存入json格式值,所以要配置cacheManager达到效果 springboot2的缓存管理器配置和sprin ...

  8. win7信息服务器iis管理器,win7iis管理器配置web服务器

    win7iis管理器配置web服务器 内容精选 换一换 代码迁移工具进行代码迁移时,需要调用Linux下的rpm.deb等命令才能完成扫描和迁移相关任务,这些命令和逻辑必须在后端Linux运行.IDE ...

  9. 使用shiro的会话管理和redis缓存管理来构建登录模块spring+struts+hibernate(SSH)

    shiro是一个很好用的安全框架,主要表现在用户认证,权限认证,会话管理,如果想优化还可以做Cache管理,我们不需要做太多工作在用户身份token安全方面(记录shiro及用redis开发的步骤及一 ...

最新文章

  1. 如何彻底卸载mysql(xp)
  2. Apache配置虚拟主机,全部指向一个目录
  3. mapper文件cant resolve param_Nodejs 中基于 Stream 的多文件合并实现
  4. 解决WP7的32位图像渐变色色阶问题
  5. libreoffice_如何更改您在LibreOffice中可以撤消的操作数
  6. BCVP开发者社区2022专属周边第一弹
  7. 如何使用mock应对测试所需随机数据
  8. 2021-04-04 CPU缓存一致性 MESI协议
  9. Object型转list,jsonObject型转list方法,亲测可用
  10. 【免费】微信群讲座:如何成为专家
  11. python通过什么对象连接数据库_干货!python与MySQL数据库的交互实战
  12. 论文笔记_S2D.69_用于 LiDAR 里程计和建图的泊松曲面重建
  13. 关于知云文献翻译显示乱码,无法翻译的解决方法
  14. 【MATLAB】(一)基本使用入门
  15. 智能传感器应用领域及其发展现状
  16. 2019年中国大学生计算机设计大赛--心得总结
  17. 微信小程序毕业设计(一)
  18. 【ML特征工程】第 6 章 :降维:用 PCA 压缩数据薄饼
  19. CF 106C Buns
  20. python学习之数据爬取及其可视化分析(一)

热门文章

  1. 20级:班级日常分享,一天一瞬间
  2. 记录程序人生2020.8.11
  3. Photoshop基本操作
  4. frameset和frame
  5. 2020蓝桥杯省赛---java---C---1(约数个数)
  6. python调用webservice接口实例_python调用webservice接口的实现
  7. hashmap应用场景_工作中常用到的Java集合有哪些?应用场景是什么?
  8. 本地方法(JNI)——编码签名
  9. MySQL 对于千万级的大表要怎么优化?
  10. caffeine 缓存_使用Caffeine和Spring Boot的多个缓存配置