源码地址:https://github.com/q200737056/Spring-Course/tree/master/springboot2Ehcache
一、项目环境
Java8+Maven3.3.9+SpringBoot2.0.4+Mybatis3+Ehcache+Mysql+Eclipse
二、加入依赖及ehcache.xml
<!--省略springboot等其它依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<!-- ehcache缓存 -->
<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache</artifactId>
</dependency>
在项目根目录下取名ehcache.xml,springboot会默认加载该配置;如若不然,可在application.yml或application.properties中配置路径。
spring:
cache:
type: ehcache
ehcache:
config: classpath:/myehcache.xml
ehcache.xml标签及属性
<ehcache name="test">
<diskStore path="java.io.tmpdir"/>
<defaultCache
maxEntriesLocalHeap="1000"
eternal="false"
timeToIdleSeconds="300"
timeToLiveSeconds="600"
overflowToDisk="true"
memoryStoreEvictionPolicy="LRU">
</defaultCache>
<cache name="myCache"
maxEntriesLocalHeap="200"
eternal="false"
timeToIdleSeconds="300"
timeToLiveSeconds="600"
overflowToDisk="true">
</cache>
</ehcache>
- diskStore标签:磁盘缓存位置
- defaultCache标签:默认缓存
- cache标签 :自定义缓存
- maxEntriesLocalHeap(旧版 maxElementsInMemory):设置了缓存的上限,最多存储多少个对象
- eternal:对象是否永不过期 (指定true则下面两项配置无效)
- timeToIdleSeconds:设置对象在失效前的允许闲置时间(单位:秒)
- timeToLiveSeconds:设置对象允许存活时间(单位:秒)
- overflowToDisk:内存中Element数量达到最大时是否允许对象被写入到磁盘
- memoryStoreEvictionPolicy:当达到最大限制时,Ehcache将会根据指定的策略去清理内存; 默认策略是LRU(最近最少使用)FIFO(先进先出) LFU(最少使用)
- maxEntriesLocalDisk:磁盘缓存最大对象数,默认为0不限制
- diskExpiryThreadIntervalSeconds:磁盘缓存的清理线程运行间隔,默认是120秒
- diskPersistent:是否持久化磁盘缓存,默认false
- copyOnRead:当缓存项被读出时是否返回它的拷贝,默认false
- copyOnWrite:当缓存项被写入时,是否写入到它的拷贝中,默认false
三、在启动类注解@EnableCaching开启缓存
@SpringBootApplication
@MapperScan("com.springboot2.test3.dao")
@EnableCaching
public class App {
public static void main( String[] args ){
SpringApplication.run(App.class, args);
System.out.println("启动成功。。。。。。。。。。。");
}
}
四、业务层方法上加缓存
@Cacheable(value="myCache",key="'user'+#id",unless = "#result eq null")
@Override
public User queryUserById(String id){
System.out.println("去查询数据库。。。");
return this.indexDao.queryUserById(Integer.valueOf(id));
}
@CachePut(value="myCache",key="'user'+#user.id")
@Override
public User updateUser(User user){
this.indexDao.updateUser(user);
return user;
}
@CacheEvict(value="myCache",key="'user'+#id")
@Override
public int deleteUser(String id){
return this.indexDao.deleteUser(id);
}
主要的几个缓存注解
- @Cacheable:对方法配置,能够根据方法的请求参数对其进行缓存
- @CacheEvict:清除缓存
- @CachePut:主要用来更新缓存
- @CacheConfig:统一配置类的缓存注解的属性
@Cacheable/@CachePut/@CacheEvict主要的参数
- value:缓存的名称,在配置文件中定义
- key:缓存的 key,可以为空,如果指定要按照 SpEL 表达式编写,
如果不指定,则缺省按照方法的所有参数进行组合 - condition:缓存的条件,只有为 true才进行缓存/清除缓存
- unless:与condition相反,只有为 false才进行缓存/清除缓存
- allEntries:是否清空所有缓存内容,缺省为 false
- beforeInvocation:是否在方法执行前就清空,缺省为 false;缺省情况下,如果方法 执行抛出异常,则不会清空缓存
五、简单介绍一下SpEL表达式
其实在Spring3中就已经支持EL表达式了,简称SpEL。以前在xml配置中,经常会看到如下表达式#{...}
。
<bean id="hello" class="com.***.Hello">
<property name="item" value="#{otherBean}" />
<!-- 把otherBean注入到hello的item属性中 -->
<property name="name" value="#{otherBean.name}" />
<!-- 把otherBean的name注入到hello的name属性中 -->
</bean>
SpEL支持字符串,数字,布尔及null。当然也可以访问变量,对象的属性,对象的方法,集合,map,静态方法等。#{person.name},#{person.getName()},#{list[0]},#{map['name']},#{T(Math).abs(-1)}
变量可以通过StandardEvaluationContext
的setVariable
方法设置到上下文中。当访问一个对象的属性或方法时, 若该对象为null, 就会出现空指针异常,可在对象后加?
。
Spring EL支持的操作符
- 关系操作符, 包括:
eq(==), ne(!=), lt()<, le(<=), gt(>), ge(>=)
- 逻辑运算符, 包括:
and(&&), or(||), not(!)
- 数学操作符, 包括:
加(+), 减(-), 乘(*), 除(/), 取模(%), 幂指数(^)
- 其他操作符, 如:
三元操作符, instanceof, 赋值(=), 正则匹配