继续上篇,这篇介绍服务层缓存,基于注解的方式使用ehcache

注解的标签主要有4个:@Cacheable、@CacheEvict、@CachePut、@Caching,他们的用法是:

@Cacheable:调用方法时会先从缓存中取,如果没有就执行方法,然后将结果存入缓存
@CacheEvict:方法执行后会清空缓存
@CachePut:无论有没有缓存都会执行方法,然后将结果存入缓存
@Caching:组合多个cache注解使用

一、修改配置文件

1、修改spring-context-ehcache.xml文件,加入:

<!-- 开启缓存注解 -->
<cache:annotation-driven cache-manager="cacheManager" /> <!-- spring的ehcache缓存配置 -->
<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager">
<property name="cacheManager" ref="ehcacheManager"></property>
</bean>

如果ehcache的bean的id就叫"cacheManager",cache-manager可以不加,因为默认值就是这个

2、修改ehcache-context.xml文件,加入:

<cache name="testDao"
maxEntriesLocalHeap="10000"
maxEntriesLocalDisk="100000"
overflowToDisk="true"
eternal="false"
timeToIdleSeconds="300"
timeToLiveSeconds="600"
/>

"testDao"是接下来要用到的缓存名称,一定要加好,不然注解使用缓存时会提示找不到

二、在方法中加入cache注解

修改testDao.java类:

@SuppressWarnings("unchecked")
@Cacheable(value="testDao", key="'list'")
public List<testInfo> getList() { String hql = "from testInfo";
Query query = sessionFactory.getCurrentSession().createQuery(hql);
query.setCacheable(true);
return query.list();
} @Cacheable(value="testDao", key="'view' + #id")
public testInfo getInfo(String id) { return (testInfo) sessionFactory.getCurrentSession().get(testInfo.class, id);
} @Caching(
put={@CachePut(value="testDao", key="'view' + #testInfo.id")},
evict={@CacheEvict(value="testDao", key="'list'")}
)
public testInfo update(testInfo testInfo) {
testInfo.setName("789");
//update
return testInfo;
} @Caching(
evict={
@CacheEvict(value="testDao", key="'view' + #id"),
@CacheEvict(value="testDao", key="'list'")}
)
public void delete(String id) {
//delete
} @CacheEvict(value="testDao", allEntries=true)
public void deleteAll() {
//deleteAll
}

查询方法使用@Cacheable注解,value属性一定要加,更新方法使用@CachePut注解,还需要清除相关的list缓存,删除方法使用@CacheEvict注解,"allEntries=true"表示清空所有缓存。

Controller的方法也可以使用缓存注解。

三、运行测试

1、修改HelloController.java类,添加更新和删除的方法:

@RequestMapping("update/{id}")
public String update(@PathVariable("id") String id, HttpServletRequest request) { testInfo testInfo = new testInfo();
testInfo.setId(id);
testDao.update(testInfo); return "redirect:/hello/list2";
} @RequestMapping("delete/{id}")
public String delete(@PathVariable("id") String id, HttpServletRequest request) { testDao.delete(id); return "redirect:/hello/list2";
}

2、修改list.jsp页面,修改table的内容为:

<table border="1" width="150px">
<tr>
<th>列1</th>
<th>列2</th>
</tr>
<c:forEach items="${testList}" var="item">
<tr>
<td>${item.id}</td>
<td>
<a href="${path}/hello/view/${item.id}" target="_blank">${item.name}</a>
<a href="${path}/hello/update/${item.id}">更新</a>
<a href="${path}/hello/delete/${item.id}">删除</a>
</td>
</tr>
</c:forEach>
</table>

3、测试

在这两个地方设置断点

第一次访问list和view的时候会命中断点,第二次就不会了

点击更新后,list的断点重新命中,再点击"233",没有命中断点,内容变成了"789",因为更新操作结束后更新了缓存

点击删除后,list和view的断点都会重新命中,因为删除操作后清空了缓存

实例代码地址:https://github.com/ctxsdhy/cnblogs-example

spring中基于注解使用ehcache的更多相关文章

  1. spring中基于注解使用AOP

    本文内容:spring中如何使用注解实现面向切面编程,以及如何使用自定义注解. 一个场景 比如用户登录,每个请求发起之前都会判断用户是否登录,如果每个请求都去判断一次,那就重复地做了很多事情,只要是有 ...

  2. Spring中基于注解的IOC(二):案例与总结

    2.Spring的IOC案例 创建maven项目 导入依赖 pom.xml xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ...

  3. Spring中基于注解的IOC(一):基础介绍

    1. Spring中的常用注解 注解配置和xml配置要实现的功能都是一样的,都要降低程序的耦合,只是配置的形式不一样 xml中配置示例: 注解分类: 1.用于创建对象的注解 它们的作用就和在xml中编 ...

  4. Spring中基于注解方式管理bean

    操作步骤 第一步:导入相关jar包 spring IoC的基本包 Spring支持注解的Jar包 第二步:创建Spring配置文件,ApplicationContext.xml 引入约束和开启注解扫描 ...

  5. spring中基于aop使用ehcache

    我就是对着这个博客看的 http://www.cnblogs.com/ctxsdhy/p/6421016.html

  6. Spring 中基于 AOP 的 @AspectJ注解实例

    @AspectJ 作为通过 Java 5 注释注释的普通的 Java 类,它指的是声明 aspects 的一种风格.通过在你的基于架构的 XML 配置文件中包含以下元素,@AspectJ 支持是可用的 ...

  7. Spring:基于注解的Spring MVC

    什么是Spring MVC Spring MVC框架是一个MVC框架,通过实现Model-View-Controller模式来很好地将数据.业务与展现进行分离.从这样一个角度来说,Spring MVC ...

  8. Spring 框架的概述以及Spring中基于XML的IOC配置

    Spring 框架的概述以及Spring中基于XML的IOC配置 一.简介 Spring的两大核心:IOC(DI)与AOP,IOC是反转控制,DI依赖注入 特点:轻量级.依赖注入.面向切面编程.容器. ...

  9. Spring boot 基于注解方式配置datasource

    Spring boot 基于注解方式配置datasource 编辑 ​ Xml配置 我们先来回顾下,使用xml配置数据源. 步骤: 先加载数据库相关配置文件; 配置数据源; 配置sqlSessionF ...

随机推荐

  1. MQTT的学习之Mosquitto安装和使用

    Mosquitto是一个实现了MQTT3.1协议的代理服务器,由MQTT协议创始人之一的Andy Stanford-Clark开发,它为我们提供了非常棒的轻量级数据交换的解决方案.本文的主旨在于记录M ...

  2. [HNOI2009]双递增序列(动态规划,序列dp)

    感觉这个题还蛮难想的. 首先状态特别难想.设\(dp[i][j]\)表示前i个数,2序列的长度为j的情况下,2序列的最后一个数的最小值. 其中1序列为上一个数所在的序列,2序列为另外一个序列. 这样设 ...

  3. cmd指令集

    CMD指令集 win+R打开运行 输入命令 可以快速执行一些程序或者功能 cmd的指令通常在system中使用 在电脑的环境变量中path中添加环境变量 环境变量可以在cmd的黑窗口进行执行进行快速打 ...

  4. Flink快速入门--安装与示例运行

    flink是一款开源的大数据流式处理框架,他可以同时批处理和流处理,具有容错性.高吞吐.低延迟等优势,本文简述flink在windows和linux中安装步骤,和示例程序的运行. 首先要想运行Flin ...

  5. POJ 1015 陪审团问题

    题意略. 思路: 这个题目开始我本来打算用个二维dp,令dp[ i ][ j ]为考虑前i个人,有j个名额的时候,我所能获取的最小差,后来发现不好转移.因为dp[ i ][ j ]有可能是+2, 也有 ...

  6. Leetcode之二分法专题-278. 第一个错误的版本(First Bad Version)

    Leetcode之二分法专题-278. 第一个错误的版本(First Bad Version) 你是产品经理,目前正在带领一个团队开发新的产品.不幸的是,你的产品的最新版本没有通过质量检测.由于每个版 ...

  7. Delphi - Indy TIdThreadComponent 线程研究

    Indy IdThreadComponent 线程研究 前几天在开发数据实时解析功能模块的时候,发现解析数据量巨大,特别耗时,程序一跑起来界面假死. 为了优化用户体验,采用了Indy 自带的IdThr ...

  8. 解决npm报错:Module build failed: TypeError: this.getResolve is not a function

    1.sass-loader的版本过高导致的编译错误,当前最高版本是8.x,需要退回到7.3.1 运行: npm uninstall sass-loader --save-dev(卸载当前版本) npm ...

  9. CF #535 (Div. 3) E2 Array and Segments (Hard version) 利用线段树进行区间转移

    传送门 题意:    有m个区间,n个a[ i ] , 选择若干个区间,使得整个数组中的最大值和最小值的差值最小.n<=1e5,m<=300; 思路: 可以知道每个i,如果一个区间包含这个 ...

  10. Bytes类型

    Bytes类型 一.定义 bytes类型是指一堆字节的集合,在python中以b开头的字符串都是bytes类型. b'\xe5\xb0\x8f\xe7\x8c\xbf\xe5\x9c\x88' ''' ...