SpringBoot整合ehcache:
添加坐标:
在我所使用的springboot2.1.1版本中,添加了ehcache坐标后反而测试报错,推测可能是jar包冲突了,去掉之后测试正常运行。
新建ehcache.xml文件:
文件头可加可不加,不影响测试
<!-- <?xml version="1.0" encoding="UTF-8"?> -->
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../config/ehcache.xsd">
<diskStore path="java.io.tmpdir"/>
<!-- 默认缓存策略 -->
<defaultCache
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
maxElementsOnDisk="10000000"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LRU">
<persistence strategy="localTempSwap"/>
</defaultCache>
<!-- 自定义缓存策略,每个缓存策略都有一个唯一的name属性作为标识 -->
<cache name="user"
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
maxElementsOnDisk="10000000"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LRU">
<persistence strategy="localTempSwap"/>
</cache>
<!--
name:缓存名称。
maxElementsInMemory:缓存最大个数。
eternal:对象是否永久有效,一但设置了,timeout将不起作用。
timeToIdleSeconds:设置对象在失效前的允许闲置时间(单位:秒)。仅当eternal=false对象不是永久有效时使用,可选属性,默认值是0,也就是可闲置时间无穷大。
timeToLiveSeconds:设置对象在失效前允许存活时间(单位:秒)。最大时间介于创建时间和失效时间之间。仅当eternal=false对象不是永久有效时使用,默认是0.,也就是对象存活时间无穷大。
overflowToDisk:当内存中对象数量达到maxElementsInMemory时,Ehcache将会对象写到磁盘中。
diskSpoolBufferSizeMB:这个参数设置DiskStore(磁盘缓存)的缓存区大小。默认是30MB。每个Cache都应该有自己的一个缓冲区。
maxElementsOnDisk:硬盘最大缓存个数。
diskPersistent:是否缓存虚拟机重启期数据 Whether the disk store persists between restarts of the Virtual Machine. The default value is false.
diskExpiryThreadIntervalSeconds:磁盘失效线程运行时间间隔,默认是120秒。
memoryStoreEvictionPolicy:当达到maxElementsInMemory限制时,Ehcache将会根据指定的策略去清理内存。默认策略是LRU(最近最少使用)。你可以设置为FIFO(先进先出)或是LFU(较少使用)。
clearOnFlush:内存数量最大时是否清除。
-->
</ehcache>
在application.properties 中配置ehcache
在启动类上加入注解:
使用缓存时要在方法或者类上加入另一个注解,注解中的value是ehcache.xml中的自定义缓存策略,该注解中还有其他属性,后边会介绍
测试:
不使用缓存:从数据库执行了两次查询
开启缓存:只从数据库查询一次
@Cacheable注解:
将当前方法的返回值放入Encache中做缓存
value属性:使用ehcache.xml中的缓存策略,不指定value则使用默认的缓存策略
key属性:将方法的返回值放入缓存中的时候放入的是一个键值对的形式,value是返回的值,key是下次,下下次。。。取值所依据的key,默认的key是#传入参数名称。
@CacheEvict注解:清除缓存,当一个查询运行之后将该查询放入缓存当中,然后执行一条dml语句,这样数据库中的数据发生了改变,然后重新查询,但是这时候查询出的数据仍然是数据发生改变之前的数据,因为是从缓存中查询,这时候就出现了数据不同步的情况。
所以每次对数据进行dml操作之后应该将缓存清空,保证数据同步
SpringBoot整合SpringData Redis:
首先添加坐标:
最重要的是redis.client坐标,没有这个的话测试失败(坑)
在springboot2.x和1.x中对于redis的配置类不一样,在2.x中配置类中只需要配置RedisTemplate即可
springboot2.x默认使用的是Lettuce连接池,1.x中使用的是默认jedisPool
连接单机版redis
密码不需要给定
连接集群版redis:
测试:
使用Redisdesktopmanager查看测试结果:
SpringBoot整合拦截器:使用SSM定义拦截器时需要在xml配置文件中配置,springboot只需要定义一个拦截器类即可
package com.tangfen.interceptor;
import java.util.Date;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.convert.converter.Converter;
import org.springframework.format.FormatterRegistry;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import com.tangfen.converter.DateConverter;
@Configuration
public class PageInterceptor implements WebMvcConfigurer{
@Override
public void addInterceptors(InterceptorRegistry registry) {
HandlerInterceptor interceptor = new HandlerInterceptor() {
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
Exception ex) throws Exception {
// TODO Auto-generated method stub
HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
}
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
// TODO Auto-generated method stub
return HandlerInterceptor.super.preHandle(request, response, handler);
}
};
//拦截路径和放行
registry.addInterceptor(interceptor).addPathPatterns("/**").excludePathPatterns("/index");
}
//定义日期转换器
@Override
public void addFormatters(FormatterRegistry registry) {
registry.addConverter((Converter<String, Date>) new DateConverter());
}
}
在SpringBoot1.x中定义拦截器可以继承WebMvcConfigurerAdapter类,然后重写addInterceptors方法,将定义的拦截器放进去,但是在SpringBoot2.x中使用的Spring5.x的版本,这种方法已经过时,所以可以使用实现WebMvcConfigurer接口的方式,然后重写addInterceptors方法
添加日期转换器同样是实现这个接口,重写addFormatters方法,将转换器类加进去即可
SpringBoot使用Scheduled定时器:
1.x版本中需要添加Scheduled的依赖坐标spring-context-support,而2.x之后自动添加了该依赖
定时器类:
使用时在启动类上加入注解:
启动测试:
SpringBoot整合Quartz:添加quartz的启动器
新建测试类:
新建配置类:
我这两个类名弄反了
启动类还是要开启注解:
启动: