Spring Cache抽象-基于XML的配置声明(基于EhCache的配置)
- 概述
- 完整示例
- 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
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的Spring Cache抽象-基于XML的配置声明(基于EhCache的配置)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring Cache抽象-基于XML
- 下一篇: Quartz-任务调度概述及Quartz