zoukankan      html  css  js  c++  java
  • spring中ehcache的配置和使用方法

    继续上篇,这篇介绍服务层缓存,ehcache一般的配置和用法

    一、添加jar包引用

    修改pom.xml文件,加入:

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context-support</artifactId>
        <version>${spring.version}</version>
    </dependency>
    

    除了之前加入的ehcache-core包,还需要加入spring-context-support包(包含EhCacheManagerFactoryBean)

    二、添加配置文件

    1、在"src/main/resources"代码文件夹中新建文件"spring-context-ehcache.xml":

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:mvc="http://www.springframework.org/schema/mvc" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:p="http://www.springframework.org/schema/p" 
        xmlns:context="http://www.springframework.org/schema/context"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
            http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context-3.0.xsd
            http://www.springframework.org/schema/mvc
            http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
         
        <description>Ehcache Configuration</description>
         
        <!-- 使用Annotation自动注册Bean -->
        <context:component-scan base-package="org.xs.techblog" use-default-filters="false">
            <context:include-filter type="annotation" expression="org.springframework.stereotype.Service" />
            <context:include-filter type="annotation" expression="org.springframework.stereotype.Repository"/>
        </context:component-scan>
         
        <!-- 缓存配置 -->
        <bean id="ehcacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
            <property name="configLocation" value="classpath:ehcache-context.xml" />
        </bean>
    </beans>
    

    ehcache的CacheManager就是通过spring提供的ehCacheManagerFactoryBean生成的,configLocation项设置了ehcache的配置文件地址。

    2、在"src/main/resources"代码文件夹中新建文件"ehcache-context.xml":

    <?xml version="1.0" encoding="UTF-8"?>
    <ehcache updateCheck="false" name="defaultCache">
        <!--默认的缓存配置(可以给每个实体类指定一个对应的缓存,如果没有匹配到该类,则使用这个默认的缓存配置)-->
        <defaultCache 
            maxEntriesLocalHeap="10000"
            maxEntriesLocalDisk="100000"
            overflowToDisk="true"
            eternal="false"
            timeToIdleSeconds="300"
            timeToLiveSeconds="600"
        />
         
        <!-- 指定缓存存放在磁盘上的位置 -->
        <diskStore path="java.io.tmpdir/demo1/ehcache/hibernate" />
    </ehcache>
    

    用来专门配置缓存里用到的cache,文件内容和上一篇的ehcache-hibernate.xml大致一样,不过需要在<ehcache name="xxx"内设置一个别名,不然会和之前的重复,tomcat会运行不通过。

    三、添加CacheUtils工具类

    在"src/main/java"代码文件夹的"org.xs.demo1"的包下新建"CacheUtils.java"类:

    package org.xs.demo1;
     
    import net.sf.ehcache.Cache;
    import net.sf.ehcache.CacheManager;
    import net.sf.ehcache.Element;
     
    /**
     * Cache工具类
     */
    public class CacheUtils {
         
        private static CacheManager cacheManager = ((CacheManager)ContextUtils.getBean("ehcacheManager"));
         
        public static Object get(String cacheName, String key) {
            Element element = getCache(cacheName).get(key);
            return element==null?null:element.getObjectValue();
        }
     
        public static void put(String cacheName, String key, Object value) {
            Element element = new Element(key, value);
            getCache(cacheName).put(element);
        }
     
        public static void remove(String cacheName, String key) {
            getCache(cacheName).remove(key);
        }
         
        private static Cache getCache(String cacheName){
            Cache cache = cacheManager.getCache(cacheName);
            if (cache == null){
                cacheManager.addCache(cacheName);
                cache = cacheManager.getCache(cacheName);
            }
            return cache;
        }
     
        public static CacheManager getCacheManager() {
            return cacheManager;
        }
    }
    

    CacheUtils读取了"ehcacheManager"bean的地址,可以创建和使用cache。

    ContextUtils提供了getBean的方法,是一个很常用的工具类,内容是:

    package org.xs.demo1;
     
    import org.springframework.beans.factory.DisposableBean;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.ApplicationContextAware;
    import org.springframework.context.annotation.Lazy;
    import org.springframework.stereotype.Service;
     
    /**
     * 获得ApplicaitonContext的工具.
     */
    @Service
    @Lazy(false)
    public class ContextUtils implements ApplicationContextAware, DisposableBean {
     
        private static ApplicationContext applicationContext = null;
     
        /**
         * 取得存储在静态变量中的ApplicationContext.
         */
        public static ApplicationContext getApplicationContext() {
            return applicationContext;
        }
     
        /**
         * 从静态变量applicationContext中取得Bean, 自动转型为所赋值对象的类型.
         */
        @SuppressWarnings("unchecked")
        public static <T> T getBean(String name) {
            return (T) applicationContext.getBean(name);
        }
         
        /**
         * 从静态变量applicationContext中取得Bean, 自动转型为所赋值对象的类型.
         */
        public static <T> T getBean(Class<T> requiredType) {
            return applicationContext.getBean(requiredType);
        }
     
        /**
         * 实现ApplicationContextAware接口, 注入Context到静态变量中.
         */
        @Override
        public void setApplicationContext(ApplicationContext applicationContext) {
            ContextUtils.applicationContext = applicationContext;
        }
     
        /**
         * 实现DisposableBean接口, 在Context关闭时清理静态变量.
         */
        @Override
        public void destroy() throws Exception {
            applicationContext = null;
        }
    }
    

    四、运行测试

    1、修改HelloController.java类的list方法:

    @SuppressWarnings("unchecked")
    @RequestMapping("list")
    public String list(HttpServletRequest request) {
             
        //先从缓存中获取list
        List<testInfo> list = (List<testInfo>)CacheUtils.get("test", "testList");
        if(list == null) {
            list = testDao.getList();
            //将list存入缓存
            CacheUtils.put("test", "testList", list);
        }
             
        //如果修改了test的数据后要马上体现,可以手动清空list缓存
        //CacheUtils.remove("test", "testList");
             
        request.setAttribute("testList", list);
             
        return "list";
    }
    

    2、测试

    访问"http://localhost:8080/demo1/hello/list":

    第一次访问,缓存里没有list,进入断点

    第二次访问,缓存里已经有list了

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

  • 相关阅读:
    省级联动(使用ajax实现)
    java学习之 反射
    自己写的代码生成器
    java中关于StackTraceElement的使用
    在Java中判断数组中包含某个元素的几种方式的比较
    android PopupWindow 点击外面消失
    android获取textview的行数
    多线程关于腾讯笔试题
    FrameLayout的点击问题
    自定义SnackBar
  • 原文地址:https://www.cnblogs.com/ctxsdhy/p/6403150.html
Copyright © 2011-2022 走看看