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     @Override
27     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      * @return
43      */
44     private Cache getCache() {
45         return this.ehCacheCacheManager.getCache(this.cachename);
46     }
47 
48     /**
49      * 获取对象
50      * 
51      * @param key
52      *            对象对应的key值
53      * @return
54      */
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 key
67      * @param value
68      */
69     public void put(Object key, Object value) {
70         getCache().put(key, value);
71     }
72     
73     /**
74      * 如果key对应的缓存数据存在则删除
75      * @param key
76      */
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 }

  执行该文件即可。 

上一篇:移动端搜索的设计技巧!


下一篇:springboot +redis 实现点赞、浏览、收藏、评论等数量的增减操作