Spring基于注解ehCache缓存整合

注解的使用参照: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来看,除了第一次访问的时候会查询数据库,后面的查询都是从缓存中获取。

  

原文地址:https://www.cnblogs.com/qiankun-site/p/5894041.html