Ehcache学习ehcache与spring注解实例

Posted 李晓娜

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Ehcache学习ehcache与spring注解实例相关的知识,希望对你有一定的参考价值。

 可以使用注解进行ehcache的添加,这样的话我们可以将ehcache与工程进行结合,我们来看一下具体需要使用那些配置。

 Ø  Jar包引入

  首先我们添加一个spring与ehcache的融合的配置文件,我这里命名为application_spring_ehcache.xml文件。

  需要添加jar包是:

  spring-context.3.2.9.RELEASE.jar

  spring-webmvc3.2.9.RELEASE.jar

  ehcache-spring-annotations1.2.0.jar

  spring-context-support4.2.6.RELEASE.jar

  页面显示使用el表达式

  jstl 1.2.jar

  standard 1.1.2.jar

 Ø  配置文件的配置

  application_spring_ehcache.xml:

<span style="font-family:Microsoft YaHei;font-size:14px;"><?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:context="http://www.springframework.org/schema/context"
       xmlns:cache="http://www.springframework.org/schema/cache" xmlns:mvc="http://www.springframework.org/schema/mvc"
       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/cache
        http://www.springframework.org/schema/cache/spring-cache-3.2.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
    <!--支持缓存注解-->
    <cache:annotation-driven cache-manager="cacheManager"/>
    <context:component-scan base-package="ehcache.*" />
    <!-- 一些@RequestMapping 请求和一些转换 -->
    <mvc:annotation-driven />

    <!-- 前后缀 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
    <!--  静态资源访问 的两种方式  -->
    <!-- <mvc:default-servlet-handler/>   -->
    <!--<mvc:resources location="/*" mapping="/**" />-->
    <mvc:view-controller path="/" view-name="forward:/index.jsp"/>
    <!-- Spring自己的基于java.util.concurrent.ConcurrentHashMap实现的缓存管理器(该功能是从Spring3.1开始提供的) -->
    <!--
    <bean id="cacheManager" class="org.springframework.cache.support.SimpleCacheManager">
        <property name="caches">
            <set>
                <bean name="myCache" class="org.springframework.cache.concurrent.ConcurrentMapCacheFactoryBean"/>
            </set>
        </property>
    </bean>
     -->
    <!-- 若只想使用Spring自身提供的缓存器,则注释掉下面的两个关于Ehcache配置的bean,并启用上面的SimpleCacheManager即可 -->
    <!-- Spring提供的基于的Ehcache实现的缓存管理器 -->
    <!--  缓存  属性-->
    <bean id="cacheManagerFactory" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
        <property name="configLocation" value="classpath:/ehcache.xml" />
    </bean>

    <bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager">
        <property name="cacheManager"  ref="cacheManagerFactory"/>
</bean>
</beans>
</span>

  ehcache.xml文件的配置

<span style="font-family:Microsoft YaHei;font-size:14px;"><ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../config/ehcache.xsd">
    <!--当内存缓存中对象数量超过maxElementsInMemory时,将缓存对象写到磁盘缓存中(需对象实现序列化接口)。-->
    <diskStore path="java.io.tmpdir"/>
    <!--:用来配置磁盘缓存使用的物理路径,Ehcache磁盘缓存使用的文件后缀名是*.data和*.index。-->
    <defaultCache
            maxElementsInMemory="10000"
            eternal="false"
            timeToIdleSeconds="120"
            timeToLiveSeconds="120"
            maxElementsOnDisk="10000000"
            diskExpiryThreadIntervalSeconds="120"
            memoryStoreEvictionPolicy="LRU">
        <persistence strategy="localTempSwap"/>
</defaultCache>
<cache name="myCache"
           eternal="false"
           maxElementsInMemory="100"
           overflowToDisk="false"
           diskPersistent="false"
           timeToIdleSeconds="0"
           timeToLiveSeconds="300"
           memoryStoreEvictionPolicy="LRU" />
</ehcache>
</span>

  web.xml文件的配置

<span style="font-family:Microsoft YaHei;font-size:14px;"><!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
  <display-name>Archetype Created Web Application</display-name>


  <servlet>
    <servlet-name>SpringMVC</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <!--启动的类加载文件-->
      <param-value>classpath:application_spring_cache.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>SpringMVC</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
</web-app>
</span>

 Ø  演示示例

  创建一个service

<span style="font-family:Microsoft YaHei;font-size:14px;">@Service
public class UserServices 

//     没有与数据库相连,直接定义一个map存储我们需要的数据
    private Map<String, String> usersData = new ConcurrentHashMap<String, String>();

    public UserServices()
        System.out.println("用户数据初始化..开始");
        usersData.put("2", "娜娜的测试");
        usersData.put("3", "娜娜带你开启我们的ehcache的学习之旅吧");
        System.out.println("用户数据初始化..完毕");
    

    //将查询到的数据缓存到myCache中,并使用方法名称加上参数中的userNo作为缓存的key
    //通常更新操作只需刷新缓存中的某个值,所以为了准确的清除特定的缓存,故定义了这个唯一的key,从而不会影响其它缓存值
    @Cacheable(value="myCache", key="'get'+#userNo")
    public String get(String userNo)
        System.out.println("数据库中查到的用户号[" + userNo + "]相应的用户名为[" + usersData.get(userNo) + "]");
        return usersData.get(userNo);
    

    @CacheEvict(value="myCache", key="'get'+#userNo")
    public void update(String userNo)
        System.out.println("更新缓存中的用户号[" + userNo + "]相应的用户名为[" + usersData.get(userNo) + "]的缓存");
    
    //allEntries为true表示清除value中的全部缓存,默认为false
    @CacheEvict(value="myCache", allEntries=true)
    public void removeAll()
        System.out.println("我们要清除缓存中的所有数据啦");
    
</span>

  创建一个controller

<span style="font-family:Microsoft YaHei;font-size:14px;">@Controller
@RequestMapping("/cacheTest")
public class UserController 
    @Resource
    private UserServices userService;
    @Resource
    private TestService testService;
    String root = "userEhcache";

    @RequestMapping(value = "/get/userNo", method = RequestMethod.GET)
    public String get( @PathVariable String userNo, Model model ) 
        String username = userService.get(userNo);
        model.addAttribute("username", username);
        return root + "/" + "getUser";
    

    @RequestMapping(value = "/update/userNo", method = RequestMethod.GET)
    public String update( @PathVariable String userNo, Model model ) 
        userService.update(userNo);
        model.addAttribute("userNo", userNo);
        return root + "/" + "updateUser";
    

    @RequestMapping(value = "/removeAll", method = RequestMethod.GET)
    public String removeAll() 
        userService.removeAll();
        return root + "/" + "removeAllUser";
    </span>

  页面


  因为页面的显示需要用到el表达式,需要引入el表达式的jar包,因为每个页面都要是使用,故而进行了封装:

  context目录下面的mytag.jsp:

<span style="font-family:Microsoft YaHei;font-size:14px;"><%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c"%>
<%@ taglib uri="http://java.sun.com/jstl/fmt_rt" prefix="fmt"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
<%@ page isELIgnored="false" %></span>
  之后在需要的每个页面引入即可,这个是index.jsp页面,之后的其他的页面根据显示内容自己定义即可

<span style="font-family:Microsoft YaHei;font-size:14px;"><%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Ehcache缓存测试</title>
</head>
<body>
查看<a href="<%=request.getContextPath()%>/cacheTest/get/2" target="_blank">1号</a>用户名
<br/>
<br/>
查看<a href="<%=request.getContextPath()%>/cacheTest/get/3" target="_blank">2号</a>用户名
<br/>
<br/>
更新<a href="<%=request.getContextPath()%>/cacheTest/update/3" target="_blank">2号</a>用户名
<br/>
<br/>
移除<a href="<%=request.getContextPath()%>/cacheTest/removeAll" target="_blank">全部</a>用户名</span>

  检验是不是从缓存中读取的数据,只要看我们控制台的输出日志即可,如果是从数据库中读取的那么就会在控制台打印出来日志,如果是从缓存中取出来,那么就不会从数据库中读取了,没有日志打出来,我们这里没有连接数据库,而是模拟从数据库取出的数据,效果是一样的。

 Ø  使用缓存的好处

  使用缓存的好处是可以大大的提高我们的访问效率,在具体设定内的时间内,只要是从缓存中存在,那么就会优先使用缓存中的数据,如果缓存中的数据被更新了,那么就会从数据库中从新查询,查询完毕后会再次存入缓存,这样的话可以保证我们获取到的数据都是实时更新的。

关于ehcache配置文件中的参数详解,网上很多这里不做详解,讲解完使用spring注解实现的示例后,我们再来讲解一下与使用拦截器与spring的集合,也就是对于方法的拦截,这样的话当访问同一个方法的时候,我们看看是不是已经查询过这个方法的数据,从而可以提供我们效果,不与数据库接触,直接返回我们的数据


以上是关于Ehcache学习ehcache与spring注解实例的主要内容,如果未能解决你的问题,请参考以下文章

spring boot学习(十三)SpringBoot缓存(EhCache 2.x 篇)

Spring整合Ehcache管理缓存

Spring整合Ehcache管理缓存

Spring整合Ehcache管理缓存

Ehcache学习总结二: Ehcache+Spring+Mybaits整合

Spring Ehcache中@Cacheable不起作用。