首页 > 代码库 > ehcache整合spring本地接口方式

ehcache整合spring本地接口方式

一、简介

  ehcache整合spring,可以通过使用echache的本地接口,从而达到定制的目的。在方法中根据业务逻辑进行判断,从缓存中获取数据或将数据保存到缓存。这样让程序变得更加灵活。

  本例子使用maven构建,需要的依赖如下:

        <dependency>            <groupId>org.springframework</groupId>            <artifactId>spring-core</artifactId>            <version>3.2.6.RELEASE</version>        </dependency>        <dependency>            <groupId>net.sf.ehcache</groupId>            <artifactId>ehcache-core</artifactId>            <version>2.4.2</version>        </dependency>        <dependency>            <groupId>org.springframework</groupId>            <artifactId>spring-context</artifactId>            <version>3.2.6.RELEASE</version>        </dependency>        <dependency>            <groupId>org.springframework</groupId>            <artifactId>spring-context-support</artifactId>            <version>3.2.6.RELEASE</version>        </dependency>

二、示例代码

  ehcache.xml代码如下:

 1 <?xml version="1.0" encoding="UTF-8"?> 2 <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 3     xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd" 4     updateCheck="false"> 5  6     <!-- 默认缓存配置 ,缓存名称为 default --> 7     <defaultCache maxElementsInMemory="50" eternal="false" 8         overflowToDisk="false" memoryStoreEvictionPolicy="LFU" /> 9     <!-- 自定义缓存,名称为lt.ehcache -->10     <cache name="lt.ecache" maxElementsInMemory="50" eternal="false"11         overflowToDisk="false" memoryStoreEvictionPolicy="LFU" />12 </ehcache>  

  spring-config-ehcache-custom.xml代码如下:

 1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" 4     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 5 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> 6  7  8     <context:annotation-config /> 9     <context:component-scan base-package="com.ehcache.custom" /> <!-- 注解扫描路径 -->10 11     <bean id="cacheService" class="com.ehcache.custom.CacheService">12         <property name="cachename" value="lt.ecache"></property> <!-- ehcache.xml中配置的缓存名称 -->13         <property name="ehCacheCacheManager" ref="ehCacheCacheManager"></property>14     </bean>15 16     <bean id="ehCacheCacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager">17         <property name="cacheManager" ref="ehcache" />18     </bean>19 20     <bean id="ehcache"21         class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">22         <property name="configLocation" value="classpath:ehcache.xml" />23     </bean>24 25 </beans>

  ehcache.xml与spring-config-ehcache-custom.xml存放在系统类路径src目录下。

  实体Employee.java如下

 1 package com.ehcache.custom; 2  3 import java.io.Serializable; 4  5 public class Employee implements Serializable { 6     private static final long serialVersionUID = -4341595236940308296L; 7     private int id; 8     private String name; 9     private String designation;10 11     public Employee(int id, String name, String designation) {12         super();13         this.id = id;14         this.name = name;15         this.designation = designation;16     }17 18     public int getId() {19         return id;20     }21 22     public void setId(int id) {23         this.id = id;24     }25 26     @Override27     public String toString() {28         return "Employee [id=" + id + ", name=" + name + ", designation="29                 + designation + "]";30     }31 32     public String getName() {33         return name;34     }35 36     public void setName(String name) {37         this.name = name;38     }39 40     public String getDesignation() {41         return designation;42     }43 44     public void setDesignation(String designation) {45         this.designation = designation;46     }47 }

  EmployeeDAO.java代码如下

package com.ehcache.custom;import java.util.ArrayList;import java.util.List;import javax.annotation.Resource;import org.springframework.cache.ehcache.EhCacheCacheManager;import org.springframework.stereotype.Component;import org.springframework.util.CollectionUtils;@Component("employeeDAO")public class EmployeeDAO {    @Resource    private CacheService cacheService;    private String listKey = "employeeList";    /**     * 获取对象列表     *      * @return     */    public List<Employee> getEmployees() {        // 从缓存中获取        List<Employee> list = (List<Employee>) cacheService.get(listKey);        if (CollectionUtils.isEmpty(list)) { // 缓存中没有数据            System.out.println("*** 缓存中没有数据 已经调用   ***");            list = new ArrayList<Employee>(5);            list.add(new Employee(1, "Ben", "Architect"));            list.add(new Employee(2, "Harley", "Programmer"));            list.add(new Employee(3, "Peter", "BusinessAnalyst"));            list.add(new Employee(4, "Sasi", "Manager"));            list.add(new Employee(5, "Abhi", "Designer"));            this.cacheService.put(listKey, list);// 存放在缓存        }else{            System.out.println("*** 缓存中数据 已经存在   ***");        }        return list;    }    /**     * 获取指定的对象     *      * @param id     *            对象id     * @param employees     * @return     */    public Employee getEmployee(int id, List<Employee> employees) {        // 从缓存中获取        Employee emp = (com.ehcache.custom.Employee) cacheService.get(id);        if (emp == null) {// 缓存中对象不存在            System.out.println("***  缓存中对象不存在: " + id + " ***");            for (Employee employee : employees) {                if (employee.getId() == id) {                    emp = employee;                }            }            this.cacheService.put(id, emp);// 保存到缓存        }else{            System.out.println("***  缓存中对象存在: " + id + " ***");        }        return emp;    }    /**     * 更新对象     *      * @param id     *            对象id     * @param designation     * @param employees     *      */    public void updateEmployee(int id, String designation,            List<Employee> employees) {         for (Employee employee : employees) {            if (employee.getId() == id) {                employee.setDesignation(designation);                this.cacheService.put(id, employee);// 保存更新后的对象到缓存            }        }    }    /**     * 添加对象     *      * @param employee     *            要添加的对象     * @param employees     *      */    public void addEmployee(Employee employee, List<Employee> employees) {         employees.add(employee);        this.cacheService.put(employee.getId(), employee);// 保存更新后的对象到缓存    }    /**     * 删除对象     *      * @param id     *            Employee对象id     * @param employees     * @return     */    public void removeEmployee(int id, List<Employee> employees) {        int i = 0;        for (Employee employee : employees) {            if (employee.getId() != id) {                i++;            } else {                break;            }        }        this.cacheService.evict(id);// 删除缓存中的数据        employees.remove(i);    }    /**     * 删除多个对象     *      * @param employees     * @return     */    public List<Employee> removeAllEmployee(List<Employee> employees) {        System.out.println("*** removeAllEmployee()  :  ***");        employees.clear();        System.out.println(employees.size());        this.cacheService.evict(listKey);// 删除缓存中的数据        return employees;    }}

  CacheService.java代码如下:

 1 package com.ehcache.custom; 2  3 import org.springframework.cache.Cache; 4 import org.springframework.cache.Cache.ValueWrapper; 5 import org.springframework.cache.ehcache.EhCacheCacheManager; 6  7 /** 8  * 封装springcache 9  * 10  */11 public class CacheService {12 13     /**14      * 缓存管理对象15      */16     private EhCacheCacheManager ehCacheCacheManager;17 18     /**19      * 缓存名称20      */21     private String cachename;22 23     public EhCacheCacheManager getEhCacheCacheManager() {24         return ehCacheCacheManager;25     }26 27     public void setEhCacheCacheManager(EhCacheCacheManager ehCacheCacheManager) {28         this.ehCacheCacheManager = ehCacheCacheManager;29     }30 31     public String getCachename() {32         return cachename;33     }34 35     public void setCachename(String cachename) {36         this.cachename = cachename;37     }38 39     /**40      * 获取进行操作的Cache对象41      * 42      * @return43      */44     private Cache getCache() {45         return this.ehCacheCacheManager.getCache(this.cachename);46     }47 48     /**49      * 获取对象50      * 51      * @param key52      *            对象对应的key值53      * @return54      */55     public Object get(Object key) {56         ValueWrapper valueWrapper = getCache().get(key);57         if (valueWrapper != null) {58             return getCache().get(key).get();59         }60         return valueWrapper;61     }62 63     /**64      * 缓存对象65      * 66      * @param key67      * @param value68      */69     public void put(Object key, Object value) {70         getCache().put(key, value);71     }72     73     /**74      * 如果key对应的缓存数据存在则删除75      * @param key76      */77     public void evict(Object key){78         getCache().evict(key);79     }80     81 82     /**83      * 该方法获取的就是 net.sf.ehcache.Cache对象84      * 85      * @return  net.sf.ehcache.Cache对象86      */87     public Object getNativeCache() {88         return getCache().getNativeCache();89     }90 91 }

  该类主要是对spring中的ehcache进行封装。

  Main.java代码如下:

 1 package com.ehcache.custom; 2  3 import java.util.List; 4  5 import org.springframework.context.ApplicationContext; 6 import org.springframework.context.support.ClassPathXmlApplicationContext; 7  8 public class Main { 9 10     public static void main(String[] args) {11 12         ApplicationContext context = new ClassPathXmlApplicationContext(13                 "spring-config-ehcache-custom.xml");14 15         EmployeeDAO dao = (EmployeeDAO) context.getBean("employeeDAO");16 17         System.out.println("-----------------------第1次调用----------------------------");18         List<Employee> employees = dao.getEmployees();19         System.out.println(employees.toString()); 20 21         System.out.println("------------------------第2次调用---------------------------");22         employees = dao.getEmployees();23         System.out.println(employees.toString()); 24 25         System.out.println("------------------------第3次调用---------------------------");26         employees = dao.getEmployees();27         System.out.println(employees.toString()); 28 29 30          System.out.println("------------------------- 获取对象--------------------------");31          System.out.println("-------------------------第1次调用--------------------------");32          Employee employee = dao.getEmployee(1, employees);33          System.out.println(employee.toString());34          System.out.println("-------------------------第2次调用--------------------------");35          employee = dao.getEmployee(1, employees);36          System.out.println(employee.toString());37         38         39          System.out.println("------------------------- 对象更新--------------------------");40          dao.updateEmployee(1, "已经更新的对象", employees);41          System.out.println("-------------------------第1次调用--------------------------");42          employee = dao.getEmployee(1, employees);43          System.out.println(employee.toString());44          System.out.println("-------------------------第2次调用--------------------------");45          employee = dao.getEmployee(1, employees);46          System.out.println(employee.toString());47         48         49          System.out.println("------------------------- 添加对象--------------------------");50          dao.addEmployee(new Employee(6, "555", "Designer5555"),employees);51          System.out.println("-------------------------第1次调用--------------------------");52          employee = dao.getEmployee(6, employees);53          System.out.println(employee);54          System.out.println("-------------------------第2次调用--------------------------");55          employee = dao.getEmployee(6, employees);56          System.out.println(employee.toString());57         58         59          System.out.println("------------------------- 清除一个对象--------------------------");60          dao.removeEmployee(2, employees);61          System.out.println("-------------------------第1次调用--------------------------");62          employees = dao.getEmployees();63          System.out.println(employees); 64          System.out.println("-------------------------第2次调用--------------------------");65          employees = dao.getEmployees();66          System.out.println(employees);67         68         69          System.out.println("------------------------- 清除所有--------------------------");70          System.out.println(employees.size());71          employees = dao.removeAllEmployee(employees);72          System.out.println("-------------------------第1次调用--------------------------");73          employees = dao.getEmployees();74          System.out.println(employees);75          System.out.println("-------------------------第2次调用--------------------------");76          employees = dao.getEmployees();77          System.out.println(employees);78     }79 }

  执行该文件即可。 

ehcache整合spring本地接口方式