博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SpringMvc Ehcache 实现缓存机制
阅读量:6414 次
发布时间:2019-06-23

本文共 8436 字,大约阅读时间需要 28 分钟。

hot3.png

SpringMvc Ehcache 缓存

环境搭建

在前面的项目中用到的springMvc的maven拷贝过来,加入三个ehcache的包,分别是ehcache-core-2.5.2.jar、ehcache-spring-annotations-1.2.0.jar、guava-13.0.1.jar

项目源码

web.xml

dispatcher
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
/WEB-INF/dispatcher-servlet.xml
1
dispatcher
/
contextConfigLocation
classpath*:spring-context.xml
org.springframework.web.context.ContextLoaderListener
index.jsp

ehcache.xml

dispatcher-servlet.xml

java.class

package com.jadyer.controller;import javax.annotation.Resource;import org.springframework.stereotype.Controller;import org.springframework.ui.Model;import org.springframework.web.bind.annotation.PathVariable;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import com.jadyer.service.UserService;/** * 这里用到的jar如下 * aopalliance.jar * commons-logging-1.1.2.jar * ehcache-2.7.4.jar * slf4j-api-1.7.5.jar * spring-aop-3.2.4.RELEASE.jar * spring-beans-3.2.4.RELEASE.jar * spring-context-3.2.4.RELEASE.jar * spring-context-support-3.2.4.RELEASE.jar * spring-core-3.2.4.RELEASE.jar * spring-expression-3.2.4.RELEASE.jar * spring-web-3.2.4.RELEASE.jar * spring-webmvc-3.2.4.RELEASE.jar * @create Oct 3, 2013 6:22:43 PM * @author 玄玉
*/@Controller@RequestMapping("cacheTest")public class UserController { @Resource private UserService userService; @RequestMapping(value="/get/{userNo}", method=RequestMethod.GET) public String get(@PathVariable String userNo, Model model){ String username = userService.get(userNo); model.addAttribute("username", username); return "getUser"; } @RequestMapping(value="/update/{userNo}", method=RequestMethod.GET) public String update(@PathVariable String userNo, Model model){ userService.update(userNo); model.addAttribute("userNo", userNo); return "updateUser"; } @RequestMapping(value="/removeAll", method=RequestMethod.GET) public String removeAll(){ userService.removeAll(); return "removeAllUser"; }}
package com.jadyer.service; import java.util.Map;import java.util.concurrent.ConcurrentHashMap; import org.springframework.cache.annotation.CacheEvict;import org.springframework.cache.annotation.Cacheable;import org.springframework.stereotype.Service; /** * Cacheable注解负责将方法的返回值加入到缓存中 * CacheEvict注解负责清除缓存(它的三个参数与@Cacheable的意思是一样的) * @see ---------------------------------------------------------------------------------------------------------- * @see value------缓存位置的名称,不能为空,若使用EHCache则其值为ehcache.xml中的
* @see key--------缓存的Key,默认为空(表示使用方法的参数类型及参数值作为key),支持SpEL * @see condition--只有满足条件的情况才会加入缓存,默认为空(表示全部都加入缓存),支持SpEL * @see ---------------------------------------------------------------------------------------------------------- * @see 该注解的源码位于spring-context-3.2.4.RELEASE-sources.jar中 * @see Spring针对Ehcache支持的Java源码位于spring-context-support-3.2.4.RELEASE-sources.jar中 * @see ---------------------------------------------------------------------------------------------------------- * @create Oct 3, 2013 6:17:54 PM * @author 玄玉
*/@Servicepublic class UserService { private Map
usersData = new ConcurrentHashMap
(); public UserService(){ System.out.println("用户数据初始化..开始"); usersData.put("2", "玄玉"); usersData.put("3", "我的博客:http://blog.csdn.net/u014201191"); System.out.println("用户数据初始化..完毕"); } //将查询到的数据缓存到myCache中,并使用方法名称加上参数中的userNo作为缓存的key //通常更新操作只需刷新缓存中的某个值,所以为了准确的清除特定的缓存,故定义了这个唯一的key,从而不会影响其它缓存值 @Cacheable(value="myCache", key="'get'+#userNo") public String get(String userNo){ System.out.println("数据库中查到此用户号[" + userNo + "]对应的用户名为[" + usersData.get(userNo) + "]"); return usersData.get(userNo); } @CacheEvict(value="myCache", key="'get'+#userNo") public void update(String userNo){ System.out.println("移除缓存中此用户号[" + userNo + "]对应的用户名[" + usersData.get(userNo) + "]的缓存"); } //allEntries为true表示清除value中的全部缓存,默认为false @CacheEvict(value="myCache", allEntries=true) public void removeAll(){ System.out.println("移除缓存中的所有数据"); }}

webapp下页面

getUser.jsp
<%@ page language="java" pageEncoding="UTF-8"%>已更新${userNo}号用户
index.jsp
<%@ page language="java" pageEncoding="UTF-8"%>查看2号用户名
查看3号用户名
更新3号用户名
移除所有用户名
removeAllUser.jsp
<%@ page language="java" pageEncoding="UTF-8"%>已移除所有用户
updateUser.jsp
<%@ page language="java" pageEncoding="UTF-8"%>当前用户名为${username}

注解解析

缓存注解有以下三个:
@Cacheable @CacheEvict @CachePut
@Cacheable(value=”myCache”),这个注释的意思是,当调用这个方法的时候,会从一个名叫 myCache的缓存中查询,如果没有,则执行实际的方法(即查询数据库),并将执行的结果存入缓存中,否则返回缓存中的对象。这里的缓存中的 key 就是参数 userName,value 就是 Account 对象。
“myCache”缓存是在 spring*.xml 中定义的名称。
@Cacheable(value="myCache", key="'get'+#userNo")    public String get(String userNo){        System.out.println("数据库中查到此用户号[" + userNo + "]对应的用户名为[" + usersData.get(userNo) + "]");        return usersData.get(userNo);    }
@CacheEvict 注释来标记要清空缓存的方法,当这个方法被调用后,即会清空缓存。注意其中一个 @CacheEvict(value=”myCache”,key=”#account.getName()”),其中的 Key 是用来指定缓存的 key 的,这里因为我们保存的时候用的是 account 对象的 name 字段,所以这里还需要从参数 account 对象中获取 name 的值来作为 key,前面的 # 号代表这是一个 SpEL 表达式,此表达式可以遍历方法的参数对象,具体语法可以参考 Spring 的相关文档手册。
@CacheEvict(value="accountCache",key="#account.getName()")// 清空 myCache 缓存  public void updateAccount(Account account) {     updateDB(account); }   @CacheEvict(value="accountCache",allEntries=true)// 清空accountCache 缓存public void reload() {     reloadAll()}@Cacheable(value="accountCache",condition="#userName.length() <=4")// 缓存名叫 accountCache public Account getAccountByName(String userName) {  // 方法内部实现不考虑缓存逻辑,直接实现业务 return getFromDB(userName); }
@CachePut 注释,这个注释可以确保方法被执行,同时方法的返回值也被记录到缓存中,实现缓存与数据库的同步更新。
@CachePut(value="accountCache",key="#account.getName()")// 更新accountCache 缓存public Account updateAccount(Account account) {    return updateDB(account); }

@Cacheable、@CachePut、@CacheEvict 注释介绍

通过上面的例子,我们可以看到 spring cache 主要使用两个注释标签,即 @Cacheable、@CachePut 和 @CacheEvict,我们总结一下其作用和配置方法。

表 1. @Cacheable 作用和配置方法
@Cacheable 的作用
 主要针对方法配置,能够根据方法的请求参数对其结果进行缓存
@Cacheable 主要的参数
value 缓存的名称,在 spring 配置文件中定义,必须指定至少一个 例如:
@Cacheable(value=”mycache”) 或者 
@Cacheable(value={”cache1”,”cache2”}
key 缓存的 key,可以为空,如果指定要按照 SpEL 表达式编写,如果不指定,则缺省按照方法的所有参数进行组合 例如:
@Cacheable(value=”testcache”,key=”#userName”)
condition 缓存的条件,可以为空,使用 SpEL 编写,返回 true 或者 false,只有为 true 才进行缓存 例如:
@Cacheable(value=”testcache”,condition=”#userName.length()>2”)
表 2. @CachePut 作用和配置方法
@CachePut 的作用
 主要针对方法配置,能够根据方法的请求参数对其结果进行缓存,和 @Cacheable 不同的是,它每次都会触发真实方法的调用
@CachePut 主要的参数
value 缓存的名称,在 spring 配置文件中定义,必须指定至少一个 例如:
@Cacheable(value=”mycache”) 或者 
@Cacheable(value={”cache1”,”cache2”}
key 缓存的 key,可以为空,如果指定要按照 SpEL 表达式编写,如果不指定,则缺省按照方法的所有参数进行组合 例如:
@Cacheable(value=”testcache”,key=”#userName”)
condition 缓存的条件,可以为空,使用 SpEL 编写,返回 true 或者 false,只有为 true 才进行缓存 例如:
@Cacheable(value=”testcache”,condition=”#userName.length()>2”)
表 3. @CacheEvict 作用和配置方法
@CachEvict 的作用
 主要针对方法配置,能够根据一定的条件对缓存进行清空
@CacheEvict 主要的参数
value 缓存的名称,在 spring 配置文件中定义,必须指定至少一个 例如:
@CachEvict(value=”mycache”) 或者 
@CachEvict(value={”cache1”,”cache2”}
key 缓存的 key,可以为空,如果指定要按照 SpEL 表达式编写,如果不指定,则缺省按照方法的所有参数进行组合 例如:
@CachEvict(value=”testcache”,key=”#userName”)
condition 缓存的条件,可以为空,使用 SpEL 编写,返回 true 或者 false,只有为 true 才清空缓存 例如:
@CachEvict(value=”testcache”,
condition=”#userName.length()>2”)
allEntries 是否清空所有缓存内容,缺省为 false,如果指定为 true,则方法调用后将立即清空所有缓存 例如:
@CachEvict(value=”testcache”,allEntries=true)
beforeInvocation 是否在方法执行前就清空,缺省为 false,如果指定为 true,则在方法还没有执行的时候就清空缓存,缺省情况下,如果方法执行抛出异常,则不会清空缓存 例如:
@CachEvict(value=”testcache”,beforeInvocation=true)

转载于:https://my.oschina.net/gaoguofan/blog/753362

你可能感兴趣的文章
一键安装kubernetes 1.13.0 集群
查看>>
RabbitMq的集群搭建
查看>>
spring boot + mybatis 同时访问多数据源
查看>>
URL中汉字转码
查看>>
[转]go正则实例
查看>>
Selector中关于顺序的注意事项
查看>>
font-size: 62.5% 的含义
查看>>
小黑小波比.清空<div>标签内容
查看>>
Java中的ExceptionInInitializerError异常及解决方法
查看>>
Spring 注入bean时的初始化和销毁操作
查看>>
java线程同步原理(lock,synchronized)
查看>>
MyEclipse中使用Hql编辑器找不到Hibernate.cfg.xml文件解决方法
查看>>
yRadio以及其它
查看>>
第四节 对象和类
查看>>
闪迪(SanDisk)U盘防伪查询(官方网站)
查看>>
Android onMeasure方法介绍
查看>>
无锁数据结构
查看>>
MySQL的变量查看和设置
查看>>
android onNewIntent
查看>>
XML特殊符号
查看>>