首页 > 代码库 > Spring缓存机制----EhCache缓存实现的配置
Spring缓存机制----EhCache缓存实现的配置
- 首先,需要添加连个jar包:ehcache-core-2.6.11.jar和slf4j-api-1.7.21.jar
- 在类加载路径下添加一个ehcache.xml配置文件,文件内容如下:
<?xml version="1.0" encoding="utf-8"?><ehcache> <diskStore path="java.io.tmpdir"/> <!-- 配置默认的缓存区 --> <defaultCache maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="120" maxElementsOnDisk="10000000" diskExpiryThreadIntervalSeconds="120" memoryStoreEvictionPolicy="LRU"/> <!-- 配置名为users的缓存区 --> <cache name="users" maxElementsInMemory="10000" eternal="false" overflowToDisk="true" timeToIdleSeconds="300" timeToLiveSeconds="600" /> <!-- maxElementsInMemory : 设置属性中最多可以放多少个对象 eternal:设置缓存是否永久有效 timeToIdleSeconds:设置缓存的对象多少秒没有被使用就会清理掉 timeToLiveSeconds:设置缓存的对象在过期之前可以缓存多少秒 diskPersistent:设置缓存是否被持久化到硬盘中,保存路径由<diskStore.../>元素指定 --></ehcache>
3.在spring的配置文件bean.xml中进行配置:
<cache:annotation-driven /><context:component-scan base-package="com.XXX.XXX"/> <!-- 配置EhCache的CacheManager 通过configLocation指定ehcache.xml文件的位置 --> <bean id="ehCacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean" p:configLocation="classpath:ehcache.xml" p:shared="false"/> <!-- 配置基于EhCache的缓存管理器,并将EhCache的CacheManager注入该缓存管理器Bean中 --> <bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager" p:cacheManager-ref="ehCacheManager"/>
上面代码中<cache:annotation-driven />的作用是启用缓存注解功能,这个是必须的,否则注解不会生效,另外,该注解一定要声明在spring主配置文件中才会生效
<cache:annotation-driven/>有一个cache-manager属性用来指定当前所使用的CacheManager对应的bean的名称,默认是cacheManager,所以当我们的CacheManager的id为cacheManager时我们可以不指定该参数,否则就需要我们指定了。
<cache:annotation-driven/>还可以指定一个mode属性,可选值有proxy和aspectj。默认是使用proxy。当mode为proxy时,只有缓存方法在外部被调用的时候Spring Cache才会发生作用,这也就意味着如果一个缓存方法在其声明对象内部被调用时Spring Cache是不会发生作用的。而mode为aspectj时就不会有这种问题。另外使用proxy时,只有public方法上的@Cacheable等标注才会起作用,如果需要非public方法上的方法也可以使用Spring Cache时把mode设置为aspectj。
此外,<cache:annotation-driven/>还可以指定一个proxy-target-class属性,表示是否要代理class,默认为false。我们前面提到的@Cacheable、@cacheEvict等也可以标注在接口上,这对于基于接口的代理来说是没有什么问题的,但是需要注意的是当我们设置proxy-target-class为true或者mode为aspectj时,是直接基于class进行操作的,定义在接口上的@Cacheable等Cache注解不会被识别到,那对应的Spring Cache也不会起作用了。
需要注意的是<cache:annotation-driven/>只会去寻找定义在同一个ApplicationContext下的@Cacheable等缓存注解。
4.使用@Cacheable执行缓存
import org.springframework.cache.annotation.CacheEvict;import org.springframework.cache.annotation.Cacheable;import org.springframework.stereotype.Service;@Service("userService")@Cacheable(value="users")public class UserServiceImpl implements UserService{ public User getUsersByNameAndAge(String name,int age){ System.out.println("--正在执行findUsersByNameAndAge()查询方法--"); return new User(name,age); } public User getAnotherUser(String name,int age){ System.out.println("--正在执行findAnotherUser()查询方法--"); return new User(name,age); } }
5.测试
import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class SpringTest { public static void main(String[] args) { ApplicationContext ctx = new ClassPathXmlApplicationContext("bean.xml"); UserService us = ctx.getBean("userService",UserService.class); User u1 = us.getUsersByNameAndAge("孙悟空", 500); User u2 = us.getAnotherUser("孙悟空", 500); System.out.println(u1==u2);}
上面结果输出true,表示第二次是重缓存中获取对象
Spring缓存机制----EhCache缓存实现的配置