spring中基于注解使用ehcache
继续上篇,这篇介绍服务层缓存,基于注解的方式使用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的更多相关文章
- spring中基于注解使用AOP
本文内容:spring中如何使用注解实现面向切面编程,以及如何使用自定义注解. 一个场景 比如用户登录,每个请求发起之前都会判断用户是否登录,如果每个请求都去判断一次,那就重复地做了很多事情,只要是有 ...
- Spring中基于注解的IOC(二):案例与总结
2.Spring的IOC案例 创建maven项目 导入依赖 pom.xml xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ...
- Spring中基于注解的IOC(一):基础介绍
1. Spring中的常用注解 注解配置和xml配置要实现的功能都是一样的,都要降低程序的耦合,只是配置的形式不一样 xml中配置示例: 注解分类: 1.用于创建对象的注解 它们的作用就和在xml中编 ...
- Spring中基于注解方式管理bean
操作步骤 第一步:导入相关jar包 spring IoC的基本包 Spring支持注解的Jar包 第二步:创建Spring配置文件,ApplicationContext.xml 引入约束和开启注解扫描 ...
- spring中基于aop使用ehcache
我就是对着这个博客看的 http://www.cnblogs.com/ctxsdhy/p/6421016.html
- Spring 中基于 AOP 的 @AspectJ注解实例
@AspectJ 作为通过 Java 5 注释注释的普通的 Java 类,它指的是声明 aspects 的一种风格.通过在你的基于架构的 XML 配置文件中包含以下元素,@AspectJ 支持是可用的 ...
- Spring:基于注解的Spring MVC
什么是Spring MVC Spring MVC框架是一个MVC框架,通过实现Model-View-Controller模式来很好地将数据.业务与展现进行分离.从这样一个角度来说,Spring MVC ...
- Spring 框架的概述以及Spring中基于XML的IOC配置
Spring 框架的概述以及Spring中基于XML的IOC配置 一.简介 Spring的两大核心:IOC(DI)与AOP,IOC是反转控制,DI依赖注入 特点:轻量级.依赖注入.面向切面编程.容器. ...
- Spring boot 基于注解方式配置datasource
Spring boot 基于注解方式配置datasource 编辑 Xml配置 我们先来回顾下,使用xml配置数据源. 步骤: 先加载数据库相关配置文件; 配置数据源; 配置sqlSessionF ...
随机推荐
- RSA加密的java实现
首先科普一波: RSA的1024位是指公钥及私钥分别是1024bit,也就是1024/8=128 Bytes RSA算法密钥长度的选择是安全性和程序性能平衡的结果,密钥长度越长,安全性越好,加密解密所 ...
- Django之ORM-model模型关系
模型类关系 1)一对多关系例:图书类-英雄类 models.ForeignKey() 定义在多的类中. 2)多对多关系例:新闻类-新闻类型类 体育新闻 国际新闻models.ManyToManyFie ...
- XHTML 和 HTML 中的 iframe
1. XHTML 有什么? XHTML是更严谨更纯净的HTML版本. 2.HTML和XHTML之间的差异 ①XHTML元素必须被正确的嵌套 /!--错误写法--/ <p><i> ...
- Linux的权限属性信息1到10位分别什么意思
要设置权限,就需要知道文件的一些基本属性和权限的分配规则. 在Linux中,ls命令常用来查看文件的属性,用于显示文件的文件名和相关属性. #ls -l 路径 [ls -l 等价于 ...
- springboot--事务的使用
@Transactional原理 事务是一些sql语句对数据库操作的集合,因此如果在一个Java方法里涉及了对数据库的操作,业务需要的话我们就可以考虑把这些操作作为一个事务.通过在方法上加个@Tran ...
- 推荐一个比 ls 命令速度快 100 倍的文件目录浏览神器
本文首发于:微信公众号「运维之美」,公众号 ID:Hi-Linux. 「运维之美」是一个有情怀.有态度,专注于 Linux 运维相关技术文章分享的公众号.公众号致力于为广大运维工作者分享各类技术文章和 ...
- P2805 [NOI2009]植物大战僵尸 + 最大权闭合子图 X 拓扑排序
传送门:https://www.luogu.org/problemnew/show/P2805 题意 有一个n * m的地图,你可以操纵僵尸从地图的右边向左边走,走的一些地方是有能量值的,有些地方会被 ...
- 牛客2018多校第五场E-room 最小费用最大流
题意:有n个寝室,每个寝室4个人,现在在搞搬寝室的活动,告诉你每个寝室之前的人员名单,和之后的人员名单,问最少需要几个人要搬寝室. 思路: 转化为最小费用最大流解决的二分图问题,对每个去年的宿舍,向每 ...
- 2018年全国多校算法寒假训练营练习比赛(第五场)H Tree Recovery
Tree Recovery 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K,其他语言262144K 64bit IO Format: %lld 链接:https://w ...
- 2014 北京区域赛 dp
Matt has N friends. They are playing a game together. Each of Matt’s friends has a magic number. In ...