• 概述
  • 完整示例
    • pomxml增加依赖
    • 数据库表数据Oracle
    • 实体类
    • 服务层
    • ehcache的配置文件
    • Spring-EhCache配置文件
    • 单元测试
    • 日志输出
    • 日志分析
  • 示例源码

概述

首先请阅读Spring Cache抽象-基于XML的配置声明(基于ConcurrentMap的配置),本篇博文基于XML的配置,使用了Ehcache缓存管理器。


基于Java类注解的EhCache请阅读 Spring Cache抽象-使用Java类注解的方式整合EhCache


完整示例

pom.xml增加依赖

<dependency><groupId>net.sf.ehcache</groupId><artifactId>ehcache</artifactId><version>${ehcache.version}</version></dependency>

版本为 : <ehcache.version>2.10.4</ehcache.version>


数据库表数据(Oracle):

实体类

package com.xgj.cache.springCacheXmlEhCache.domain;import java.io.Serializable;/*** * * @ClassName: LittleArtisan* * @Description: Java中的缓存和序列化是息息相关的,注意实现Serializable接口* * @author: Mr.Yang* * @date: 2017年10月2日 下午1:40:53*/public class LittleArtisan implements Serializable {private static final long serialVersionUID = 1L;private String artisanId;private String artisanName;private String artisanDesc;public String getArtisanId() {return artisanId;}public void setArtisanId(String artisanId) {this.artisanId = artisanId;}public String getArtisanName() {return artisanName;}public void setArtisanName(String artisanName) {this.artisanName = artisanName;}public String getArtisanDesc() {return artisanDesc;}public void setArtisanDesc(String artisanDesc) {this.artisanDesc = artisanDesc;}public static long getSerialversionuid() {return serialVersionUID;}}

服务层

package com.xgj.cache.springCacheXmlEhCache.service;import java.sql.ResultSet;
import java.sql.SQLException;import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowCallbackHandler;import com.xgj.cache.springCacheXmlEhCache.domain.LittleArtisan;/*** * * @ClassName: LittleArtisanSpringCacheService* * @Description:* * @author: Mr.Yang* * @date: 2017年10月4日 上午12:41:32*/public class LittleArtisanSpringCacheService {private Logger logger = Logger.getLogger(LittleArtisanSpringCacheService.class);private static final String selectArtisanSQL = "select artisan_id ,artisan_name ,artisan_desc from little_artisan where artisan_name = ?";private JdbcTemplate jdbcTemplate;@Autowiredpublic void setJdbcTemplate(JdbcTemplate jdbcTemplate) {this.jdbcTemplate = jdbcTemplate;}/*** * * @Title: getArtisan* * @Description: getArtisan 通过在xml中配置 缓存数据* * @param artisanName* @return* * @return: LittleArtisan*/public LittleArtisan getArtisan(String artisanName) {// 方法内部实现不考虑缓存逻辑,直接实现业务System.out.println("查找Artisan:" + artisanName);return getFromDB(artisanName);}/*** * * @Title: reloadArtisan* * @Description: 清除缓存* * * @return: void*/public void reloadArtisan() {System.out.println("cache cleared");}/*** * * @Title: getFromDB* * @Description: 从数据库中获取LittleArtisan* * @param artisanName* @return* * @return: LittleArtisan*/private LittleArtisan getFromDB(String artisanName) {System.out.println("getFromDB");final LittleArtisan littleArtisan = new LittleArtisan();jdbcTemplate.query(selectArtisanSQL, new Object[] { artisanName },new RowCallbackHandler() {@Overridepublic void processRow(ResultSet rs) throws SQLException {littleArtisan.setArtisanId(rs.getString("artisan_id"));littleArtisan.setArtisanName(rs.getString("artisan_name"));littleArtisan.setArtisanDesc(rs.getString("artisan_desc"));}});return littleArtisan;}
}

ehcache的配置文件

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:noNamespaceSchemaLocation="ehcache.xsd" updateCheck="true"monitoring="autodetect" dynamicConfig="true"><diskStore path="java.io.tmpdir" /><cache name="littleArtisan" maxEntriesLocalHeap="100"maxEntriesLocalDisk="1000" eternal="false" timeToIdleSeconds="300" timeToLiveSeconds="600"memoryStoreEvictionPolicy="LFU" transactionalMode="off"><persistence strategy="localTempSwap" /></cache>
</ehcache>

Spring-EhCache配置文件

<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:context="http://www.springframework.org/schema/context"xmlns:cache="http://www.springframework.org/schema/cache"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsdhttp://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd"><!-- 扫描注入注解,比如@Autowired --><context:component-scan base-package="com.xgj.cache.springCacheXml"/><!-- 使用context命名空间,加载数据库的properties文件 --><context:property-placeholder location="classpath:spring/jdbc.properties" /><!-- 数据库 --><bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"destroy-method="close" p:driverClassName="${jdbc.driverClassName}"p:url="${jdbc.url}" p:username="${jdbc.username}" p:password="${jdbc.password}" /><!-- 配置namedParameterJdbcTemplate模板 --><bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"><constructor-arg ref="dataSource"/></bean><!-- 定义需要使用缓存的类 --><bean id="littleArtisanSpringCacheService"  class="com.xgj.cache.springCacheXmlEhCache.service.LittleArtisanSpringCacheService"/><!-- 缓存管理器 Ehcache实现--><bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager" p:cache-manager-ref="ehcacheManager"/><bean id="ehcacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean" p:config-location="ehcache/ehcache-spring.xml"/><!-- 缓存定义 --><cache:advice  id="cacheAdvice" cache-manager="cacheManager" ><cache:caching cache="littleArtisan"> <!-- 公共缓存littleArtisan --><cache:cacheable method="getArtisan" key="#artisanName"/> <!-- getArtisan使用 Cacheable  --><cache:cache-evict method="reloadArtisan" all-entries="true"/><!-- reloadArtisan使用 CacheEvict  --></cache:caching></cache:advice><!-- 切面增强 --><aop:config><aop:pointcut id="cachePoint" expression="execution(* com.xgj.cache.springCacheXmlEhCache.service.LittleArtisanSpringCacheService.*(..))" /><aop:advisor advice-ref="cacheAdvice" pointcut-ref="cachePoint"/>    </aop:config></beans>

上面的配置使用了一个Spring提供的EhCacheCacheManager来生成一个Spring的CacheManager,其接收一个Ehcache的CacheManager,因为真正用来存入缓存数据的还是Ehcache。

Ehcache的CacheManager是通过Spring提供的EhCacheManagerFactoryBean来生成的,其可以通过指定ehcache的配置文件位置来生成一个Ehcache的CacheManager。

若未指定则将按照Ehcache的默认规则取classpath根路径下的ehcache.xml文件,若该文件也不存在,则获取Ehcache对应jar包中的ehcache-failsafe.xml文件作为配置文件。


单元测试

package com.xgj.cache.springCacheXmlEhCache.service;import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;import com.xgj.cache.springCacheXmlEhCache.domain.LittleArtisan;public class TestXmlCacheEhcache {ClassPathXmlApplicationContext context = null;LittleArtisanSpringCacheService service = null;LittleArtisan littleArtisan;@Beforepublic void initContext() {// 启动Spring 容器context = new ClassPathXmlApplicationContext("classpath:com/xgj/cache/springCacheXmlEhCache/conf_spring_ehcache.xml");}@Testpublic void testXmlCache() {service = context.getBean("littleArtisanSpringCacheService",LittleArtisanSpringCacheService.class);// 第一次 从数据库加载littleArtisan = service.getArtisan("littleArtisan");printArtisan();// 第二次 从缓存加载littleArtisan = service.getArtisan("littleArtisan");printArtisan();// 清空缓存service.reloadArtisan();// 再次查询,从数据库加载service.getArtisan("littleArtisan");printArtisan();// 又查询,从缓存加载service.getArtisan("littleArtisan");printArtisan();}private void printArtisan() {System.out.println(littleArtisan.getArtisanName() + "||"+ littleArtisan.getArtisanDesc());}@Afterpublic void releaseContext() {if (context != null) {context.close();}}
}

日志输出

2017-10-04 11:12:56,227  INFO [main] (AbstractApplicationContext.java:583) - Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@683a412e: startup date [Wed Oct 04 11:12:56 BOT 2017]; root of context hierarchy
2017-10-04 11:12:56,324  INFO [main] (XmlBeanDefinitionReader.java:317) - Loading XML bean definitions from class path resource [com/xgj/cache/springCacheXmlEhCache/conf_spring_ehcache.xml]
2017-10-04 11:12:57,559  INFO [main] (EhCacheManagerFactoryBean.java:130) - Initializing EhCache CacheManager
查找Artisan:littleArtisan
getFromDB
littleArtisan||EhCache
littleArtisan||EhCache
cache cleared
查找Artisan:littleArtisan
getFromDB
littleArtisan||EhCache
littleArtisan||EhCache
2017-10-04 11:12:58,901  INFO [main] (AbstractApplicationContext.java:984) - Closing org.springframework.context.support.ClassPathXmlApplicationContext@683a412e: startup date [Wed Oct 04 11:12:56 BOT 2017]; root of context hierarchy
2017-10-04 11:12:58,901  INFO [main] (EhCacheManagerFactoryBean.java:187) - Shutting down EhCache CacheManager

日志分析

第一次从数据库中加载,第二次没有打印getFromDB,说明是从缓存中取的数据。 然后清空缓存,第一次从数据库中加载,第二次从缓存中取的数据。


示例源码

代码已托管到Github—> https://github.com/yangshangwei/SpringMaster

Spring Cache抽象-基于XML的配置声明(基于EhCache的配置)相关推荐

  1. Spring Cache抽象-缓存注解

    文章目录 概述 Spring缓存的基本原理 @Cacheable :主要针对方法配置,能够根据方法的请求参数对其结果进行缓存 键生成器 带条件的缓存 @Cacheable 注解参数说明 示例-缓存管理 ...

  2. Spring Cache抽象-使用Java类注解的方式整合EhCache

    概述 工程结构 源码 概述 Spring Cache抽象-之缓存注解这篇博文中我们介绍了SpringCache抽象注解的使用方式 既然这是一个抽象,我们需要一个具体的缓存存储实现.比价流行的有:基于J ...

  3. Spring Cache抽象-基于XML的配置声明(基于ConcurrentMap的配置)

    概述 示例 项目结构 数据库表数据Oracle 实体类 服务层 Spring配置文件 单元测试 日志输出 日志分析 示例源码 概述 Spring Cache基于注解的配置 如果不想使用注解或者由于其他 ...

  4. Spring Cache抽象-使用SpEL表达式

    概述 SpEl表达式 概述 在Spring Cache注解属性中(比如key,condition和unless),Spring的缓存抽象使用了SpEl表达式,从而提供了属性值的动态生成及足够的灵活性. ...

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

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

  6. Spring基于 XML 的声明式事务控制(配置方式)

    一.引入依赖 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http ...

  7. Spring中Bean管理操作基于XML配置文件方法实现

    Spring中Bean管理操作基于XML配置文件方法实现 基于XML配置文件方式实现 1.基于`xml`方式创建对象 2.基于`xml`方式注入属性 1.创建类,定义属性和对应的set方法 2.在Sp ...

  8. 聊一聊JAVA中的缓存规范 —— 虽迟但到的JCache API与天生不俗的Spring Cache

    为何需要规范 上一章中构建的最简化版本的缓存框架,虽然可以使用,但是也存在一个问题,就是它对外提供的实现接口都是框架根据自己的需要而自定义的.这样一来,项目集成了此缓存框架,后续如果想要更换缓存框架的 ...

  9. 注释驱动的 Spring cache 缓存介绍--转载

    概述 Spring 3.1 引入了激动人心的基于注释(annotation)的缓存(cache)技术,它本质上不是一个具体的缓存实现方案(例如 EHCache 或者 OSCache),而是一个对缓存使 ...

最新文章

  1. LeetCode 236. 二叉树的最近公共祖先
  2. CIKM 2020 | 如何更为合适地评测推荐算法? Top-N物品推荐算法评测设置回顾
  3. Panoptic SegFormer:全景分割第一名!南大港大英伟达提出新算法,霸榜全景分割
  4. Raft 集群成员变更、日志压缩、客户端交互
  5. Eclipse打JAR包引用的第三方JAR包找不到 问题解决
  6. java 数据库工厂_月光软件站 - 编程文档 - Java - 简单的数据库连接工厂实现
  7. 数据结构-Hash总结(三):实践基础篇
  8. tiny xml 使用总结
  9. 在Airtest中如何使用无线模式控制手机
  10. Hadoop学习之pig
  11. 代码写成这样,老板把我开除了| IT 巨能唠
  12. JSP中嵌入java代码方式以及指令
  13. 如何用Colab运行XGBoost模型
  14. 孙鑫-MFC笔记六--绘图,重绘
  15. kali linux 自动登录,Kali Linux SSH登录故障处理
  16. 怎么让放大的图片变清晰?
  17. 第一章 广告系统架构
  18. 手写计算机在线计算,计算器中的神器《MyScript手写计算器》
  19. 查看计算机温度指令,如何查看电脑CPU的温度?查看CPU温度的两种方法
  20. 记:《洛克菲勒留给儿子的38封信》-- 8

热门文章

  1. 关于计算机应用技术的周记,计算机应用技术专业实习周记范文
  2. io密集型和cpu密集型java,如何设计CPU密集型与I/O密集型程序
  3. arima模型 p q d 确定_基于ARIMA预测股指期货价格走势
  4. 168. Leetcode 134. 加油站 (贪心算法-模拟题目)
  5. 空间金字塔池化SPP
  6. Linux mount/unmount命令
  7. Matplotlib-动态更新图表
  8. JAVA API实现HDFS操作(二)操作函数
  9. 小米亿级大数据实时分析与工具选型 【转】
  10. 阅读源代码的一点小技巧