Spring整合Ehcache

1488966428

前言Spring整合其他的框架一般思路就是用Spring的Bean来管理,就行Spring与hibernate的sessionFactory一样

我使用的IDE和工具是idea+meavn

1.在pom.xml添加ehcache依赖 <dependency> <groupId>net.sf.ehcache</groupId> <artifactId>ehcache</artifactId> <version>2.8.2</version> </dependency>
2.Ehcache的配置文件ehcache-setting.xml

<?xml version=”1.0” encoding=”UTF-8”?>

<ehcache>

&lt;diskStore path="java.io.tmpdir"/&gt;

<!-- 设定缓存的默认数据过期策略 -->
<defaultCache  maxElementsInMemory="10000" eternal="false" overflowToDisk="true" timeToIdleSeconds="10" timeToLiveSeconds="20" diskPersistent="false" diskExpiryThreadIntervalSeconds="120"/>

<cache name="cacheTest" maxElementsInMemory="1000" eternal="false" overflowToDisk="true" timeToIdleSeconds="10" timeToLiveSeconds="20"/>

</ehcache>
下面是cache元素的属性
name:缓存名称

maxElementsInMemory:内存中最大缓存对象数

maxElementsOnDisk:硬盘中最大缓存对象数,若是0表示无穷大

eternal:true表示对象永不过期,此时会忽略timeToIdleSeconds和timeToLiveSeconds属性,默认为false

overflowToDisk:true表示当内存缓存的对象数目达到了

maxElementsInMemory界限后,会把溢出的对象写到硬盘缓存中。注意:如果缓存的对象要写入到硬盘中的话,则该对象必须实现了Serializable接口才行。

diskSpoolBufferSizeMB:磁盘缓存区大小,默认为30MB。每个Cache都应该有自己的一个缓存区。

diskPersistent:是否缓存虚拟机重启期数据,是否持久化磁盘缓存,当这个属性的值为true时,系统在初始化时会在磁盘中查找文件名为cache名称,后缀名为index的文件,这个文件中存放了已经持久化在磁盘中的cache的index,找到后会把cache加载到内存,要想把cache真正持久化到磁盘,写程序时注意执行net.sf.ehcache.Cache.put(Element element)后要调用flush()方法。

diskExpiryThreadIntervalSeconds:磁盘失效线程运行时间间隔,默认为120秒

timeToIdleSeconds: 设定允许对象处于空闲状态的最长时间,以秒为单位。当对象自从最近一次被访问后,如果处于空闲状态的时间超过了timeToIdleSeconds属性值,这个对象就会过期,EHCache将把它从缓存中清空。只有当eternal属性为false,该属性才有效。如果该属性值为0,则表示对象可以无限期地处于空闲状态

timeToLiveSeconds:设定对象允许存在于缓存中的最长时间,以秒为单位。当对象自从被存放到缓存中后,如果处于缓存中的时间超过了 timeToLiveSeconds属性值,这个对象就会过期,EHCache将把它从缓存中清除。只有当eternal属性为false,该属性才有效。如果该属性值为0,则表示对象可以无限期地存在于缓存中。timeToLiveSeconds必须大于timeToIdleSeconds属性,才有意义

memoryStoreEvictionPolicy:当达到maxElementsInMemory限制时,Ehcache将会根据指定的策略去清理内存。可选策略有:LRU(最近最少使用,默认策略)、FIFO(先进先出)、LFU(最少访问次数)。
3.在applicationContext.xml添配置Bean

<!--启用缓存注解功能-->

<cache:annotation-driven cache-manager=”cacheManager” />

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

<bean id="ehcache" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
    <property name="configLocation" value="classpath:ehcache-setting.xml"></property>
</bean>
<!--ehche end-->

别忘了在根标签添加xmlns:cache=”http://www.springframework.org/schema/cache

4.编写Service
package com.ehcache.service;

import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

/**

  • Created by Ape
    */
    @Service
    public class EhcacheService {

    /**

    • 这里注解中value=cacheTest与ehcache-setting.xml中的cache名称属性值一致。
    • @param key
    • @return
      */
      @Cacheable(value = “cacheTest”, key = “‘key-‘ + #key”)
      public String get(String key){
      return String.valueOf(System.currentTimeMillis());
      }

}
5.编写测试方法
@Autowired
private EhcacheService ehcacheService;
@Test
public void test() throws InterruptedException {
System.out.println(“第一次调用->” + ehcacheService.get(“k”));
Thread.sleep(2000);
System.out.println(“2秒后调用->” + ehcacheService.get(“k”));
Thread.sleep(9900);
System.out.println(“9.9秒后调用->” + ehcacheService.get(“k”));
Thread.sleep(10001);
System.out.println(“10.001秒后调用->” + ehcacheService.get(“k”));
}
配置文件设定10秒缓存,运行结果会看到键值为k的10秒内的获取结果一样

这样就成功整合了Ehcache

Meavn多Module搭建Springmvc + MyBatis + Druid 以及项目热部署

1493212884

IDE:idea + meavn

框架:Spring + Springmvc + MyBatis + Druid

如何new project new module 就此省略

演示项目暂时new 了这几个module,分别的packaging打包类型为

apeweb-bean(jar)

apeweb-core(jar)

apeweb-mybatis(jar)

apeweb-service(jar)

apeweb-web(war)

apeweb(pom)

其中,父模块必须以pom打包类型

然后是添加Spring mybatis druid相关依赖 <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${spring.version}</version> <scope>test</scope> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency>

<!-- connection pool -->
<dependency>
    <groupId>org.apache.tomcat</groupId>
    <artifactId>tomcat-jdbc</artifactId>
    <version>${tomcat-jdbc.version}</version>
    <scope>runtime</scope>
</dependency>

<!-- spring start -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-aop</artifactId>
    <version>${spring.version}</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-aspects</artifactId>
    <version>${spring.version}</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-beans</artifactId>
    <version>${spring.version}</version>
</dependency>
<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>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>${spring.version}</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-dao</artifactId>
    <version>2.0.8</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-expression</artifactId>
    <version>${spring.version}</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>${spring.version}</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-mock</artifactId>
    <version>2.0.8</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-orm</artifactId>
    <version>${spring.version}</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-test</artifactId>
    <version>${spring.version}</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-tx</artifactId>
    <version>${spring.version}</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    <version>${spring.version}</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>${spring.version}</version>
</dependency>
<!-- spring end -->


<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.0.9</version>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>${mysql-connector-java.version}</version>
</dependency>

<!-- mybatis start -->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.2.1</version>
</dependency>
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-spring</artifactId>
    <version>1.2.0</version>
</dependency>
<!-- mybatis end -->

spring的配置

<?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:aop=”http://www.springframework.org/schema/aop
xmlns:context=”http://www.springframework.org/schema/context
xmlns:tx=”http://www.springframework.org/schema/tx
xsi:schemaLocation=”http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
“>

<!-- 启用注解 -->
<context:annotation-config />


<!-- 启动组件扫描,排除@Controller组件,该组件由SpringMVC配置文件扫描 -->
<context:component-scan base-package="com.ape.*">
    <context:exclude-filter type="annotation"
        expression="org.springframework.stereotype.Controller" />
</context:component-scan>
<context:component-scan base-package="com" />

</beans>
mybatis的配置
<?xml version=”1.0” encoding=”UTF-8”?>
<beans xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance
xmlns:aop=”http://www.springframework.org/schema/aop
xmlns:tx=”http://www.springframework.org/schema/tx
xmlns=”http://www.springframework.org/schema/beans
xsi:schemaLocation=”
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
“>

<bean name="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"></property>
</bean>

<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations">
        <list>
            <value>classpath:dbconfig.properties</value>
        </list>
    </property>
</bean>

<!-- 阿里 druid数据库连接池 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">
    <!-- 数据库基本信息配置 -->
    <property name="url" value="${url}"/>
    <property name="username" value="${username}"/>
    <property name="password" value="${password}"/>
    <property name="driverClassName" value="${driverClassName}"/>
    <property name="filters" value="${filters}"/>
    <!-- 最大并发连接数 -->
    <property name="maxActive" value="${maxActive}"/>
    <!-- 初始化连接数量 -->
    <property name="initialSize" value="${initialSize}"/>
    <!-- 配置获取连接等待超时的时间 -->
    <property name="maxWait" value="${maxWait}"/>
    <!-- 最小空闲连接数 -->
    <property name="minIdle" value="${minIdle}"/>
    <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
    <property name="timeBetweenEvictionRunsMillis" value="${timeBetweenEvictionRunsMillis}"/>
    <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
    <property name="minEvictableIdleTimeMillis" value="${minEvictableIdleTimeMillis}"/>
    <property name="validationQuery" value="${validationQuery}"/>
    <property name="testWhileIdle" value="${testWhileIdle}"/>
    <property name="testOnBorrow" value="${testOnBorrow}"/>
    <property name="testOnReturn" value="${testOnReturn}"/>
    <property name="maxOpenPreparedStatements" value="${maxOpenPreparedStatements}"/>
    <!-- 打开removeAbandoned功能 -->
    <property name="removeAbandoned" value="${removeAbandoned}"/>
    <!-- 1800秒,也就是30分钟 -->
    <property name="removeAbandonedTimeout" value="${removeAbandonedTimeout}"/>
    <!-- 关闭abanded连接时输出错误日志 -->
    <property name="logAbandoned" value="${logAbandoned}"/>
</bean>

<tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
        <tx:method name="delete*" propagation="REQUIRED" read-only="false"
                   rollback-for="java.lang.Exception"/>
        <tx:method name="insert*" propagation="REQUIRED" read-only="false"
                   rollback-for="java.lang.Exception"/>
        <tx:method name="update*" propagation="REQUIRED" read-only="false"
                   rollback-for="java.lang.Exception"/>
        <tx:method name="save*" propagation="REQUIRED" read-only="false"
                   rollback-for="java.lang.Exception"/>
    </tx:attributes>
</tx:advice>

<aop:aspectj-autoproxy proxy-target-class="true"/>

<!-- 事物处理 -->
<aop:config>
    <aop:pointcut id="tx" expression="execution(* com.ape.service..*(..))"/>
    <aop:advisor pointcut-ref="tx" advice-ref="txAdvice"/>
</aop:config>

<!-- 配置mybatis -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="configLocation" value="classpath:mybatis/mybatis-config.xml"></property>
    <!-- mapper扫描 -->
    <property name="mapperLocations" value="classpath:mapper/*/*.xml"></property>
</bean>

<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate" >
    <constructor-arg ref="sqlSessionFactory"/>
</bean>

</beans>
springmvc的配置
<?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:mvc=”http://www.springframework.org/schema/mvc
xmlns:context=”http://www.springframework.org/schema/context
xsi:schemaLocation=”http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

<mvc:annotation-driven/>    
<mvc:default-servlet-handler/>

<context:component-scan base-package="com" />

<!-- 对静态资源文件的访问  restful-->     
<!--<mvc:resources mapping="/admin/**" location="/,/admin/" />-->
<!--<mvc:resources mapping="/static/**" location="/,/static/" />-->
<!--<mvc:resources mapping="/plugins/**" location="/,/plugins/" />-->
<!--<mvc:resources mapping="/uploadFiles/**" location="/,/uploadFiles/" /> -->

<!-- 配置SpringMVC的视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/jsp/"/>
    <property name="suffix" value=".jsp"/>
</bean>

<!--<bean id="exceptionResolver" class="com.fh.resolver.MyExceptionResolver"></bean>-->
<!-- 上传拦截,如最大上传值及最小上传值 -->
  <bean id="multipartResolver"   class="org.springframework.web.multipart.commons.CommonsMultipartResolver" >
      <property name="maxUploadSize">
          <value>104857600</value>
       </property>
        <property name="maxInMemorySize">
            <value>4096</value>
        </property>
         <property name="defaultEncoding">
            <value>utf-8</value>
        </property>
</bean>

</beans>
好吧,其实跟普通的ssm搭建没什么区别,但是需要注意的是添加module依赖问题

还有就是到 File -> Project Structure -> Project Settings -> Facets 添加一下Web路径

搭建遇到的小问题
Java.lang.IllegalArgumentException: Mapped Statements collection does not contain value for PersonMapper.listAll
报错原因:没有成功引入mybatis 模块的依赖,导致找不到PersonMapper报异常

当时的pom.xml已经添加了apeweb-mybatis依赖

<dependency>
     <groupId>com.ape</groupId>
     <artifactId>apeweb-mybatis</artifactId>
     <version>1.0-SNAPSHOT</version>
 </dependency>

解决办法: File -> Project Structure -> Project Settings -> Artifacts 添加配置
idea简单的两步实现热部署
何为热部署,就是修改java代码 jsp页面自动编译,无需重新部署项目

上图,修改 Upldate 跟 frame deactivation 为 Update classes and resources

然后以Debug模式运行项目,一定要Debug模式!!!