注解的使用參照:http://blog.csdn.net/wjacketcn/article/details/50945887 (侵刪)
ehCache是純java實現的緩存組件,spring從3.1開始引入了對ehcache的支持。
使用:
1、在pom.xml中添加依賴
<dependency> <groupId>net.sf.ehcache</groupId> <artifactId>ehcache</artifactId> <version>2.9.1</version> </dependency>
2、在classPath下增加ehcache配置文件ehcache.xml
<?xml version="1.0" encoding="UTF-8"?> <ehcache updateCheck="false"> <diskStore path="java.io.tmpdir"/> <defaultCache maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="true" diskPersistent="false" diskExpiryThreadIntervalSeconds="120" memoryStoreEvictionPolicy="LRU" />
<!--這個名稱會用到--> <cache name="myCache" maxElementsInMemory="10000" eternal="false" overflowToDisk="true" timeToIdleSeconds="30" timeToLiveSeconds="60" memoryStoreEvictionPolicy="LFU" /> </ehcache>
3、applicationContext.xml 添加配置(類似於事物配置)
<!--開啟緩存的注解功能,否則注解無法生效--> <cache:annotation-driven /> <!-- 聲明緩存管理器 --> <bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager"> <property name="cacheManager" ref="ehCacheFactory"></property> </bean> <!--指定工廠類及ehcache.xml文件位置--> <bean id="ehCacheFactory" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"> <property name="configLocation" value="classpath:ehcache.xml"/> </bean>
4、在service層添加注解
@Cacheable(value="myCache") //這個名稱就是ehcache.xml文件中的name屬性的值 public List<FreeUrl> findAll(){ return freeUrlMapper.findAll(); }
案例:攔截器放過免認證的路徑
創建表:freeUrl
CREATE TABLE `freeurl` (
`id` int(11) NOT NULL,
`url` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
)
上述配置完成之后進行如下配置
1、在spring-mvc.xml中配置攔截器路徑
<mvc:interceptors> <bean class="com.util.interceptors.LoginInterceptors"/> </mvc:interceptors>
2、編寫service代碼並將查詢結果存入緩存
@Cacheable(value="myCache") public List<FreeUrl> findAll(){ return freeUrlMapper.findAll(); }
3、編寫攔截器代碼
public class LoginInterceptors extends HandlerInterceptorAdapter{ private Logger log = LogManager.getLogger(LoginInterceptors.class); @Resource private FreeUrlService freeUrlService; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { //獲取項目路徑 String contextPath = request.getContextPath(); //獲取訪問路徑 String requestPath = request.getServletPath(); HttpSession session = request.getSession(); //查詢免認證路徑 List<FreeUrl> list = freeUrlService.findAll(); for (FreeUrl freeUrl : list) { //如果請求路徑為免認證路徑則放開 if(freeUrl.getUrl().equals(requestPath)){ return true; } } return false; } }
4、效果查看
啟動項目之后第一次訪問時會調用freeUrlService.findAll()查詢數據庫,同時將查詢結果放入緩存。第二次及后面的訪問會直接從緩存中獲取已經存入的結果,
不會再去訪問數據庫。可以通過打印SQL來看,除了第一次訪問的時候會查詢數據庫,后面的查詢都是從緩存中獲取。
