博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
spring3 自带 cache 整合之方法缓存
阅读量:6634 次
发布时间:2019-06-25

本文共 3692 字,大约阅读时间需要 12 分钟。

hot3.png

spring3 自带 cache 整合之方法缓存 博客分类: spring  

最近项目刚好用的spring版本是Spring3.1.M1 ,好像 spring3就开始有了对缓存的整合。其实底层的实现也就是上篇文件一样。

spring3.1.M1中负责cache的模块是org.springframework.context-3.1.0.M1.jar

2.5时的modules模块类似,3.1的注解缓存也是在方法上声明注解,3.1同样提供了两个注解:

@Cacheable:负责将方法的返回值加入到缓存中

@CacheEvict:负责清除缓存

@Cacheable 支持如下几个参数:

value:缓存位置名称,不能为空,如果使用EHCache,就是ehcache.xml中声明的cachename

key:缓存的key,默认为空,既表示使用方法的参数类型及参数值作为key,支持SpEL

condition:触发条件,只有满足条件的情况才会加入缓存,默认为空,既表示全部都加入缓存,支持SpEL

1 //将缓存保存进andCache,并使用参数中的userId加上一个字符串(这里使用方法名称)作为缓存的key

2 @Cacheable(value="andCache",key="#userId + 'findById'")

3 public SystemUser findById(String userId) {

4 SystemUser user = (SystemUser) dao.findById(SystemUser.class, userId);

5 return user ;

6 }

7 //将缓存保存进andCache,并当参数userId的长度小于32时才保存进缓存,默认使用参数值及类型作为缓存的key

8 @Cacheable(value="andCache",condition="#userId.length < 32")

9 public boolean isReserved(String userId) {

10 System.out.println("hello andCache"+userId);

11 return false;

12 }

@CacheEvict 支持如下几个参数:

value:缓存位置名称,不能为空,同上

key:缓存的key,默认为空,同上

condition:触发条件,只有满足条件的情况才会清除缓存,默认为空,支持SpEL

allEntries:true表示清除value中的全部缓存,默认为false

//清除掉指定key的缓存

@CacheEvict(value="andCache",key="#user.userId + 'findById'")
public void EvictUserRole(SystemUser user) {
System.out.println("hello andCache delete"+user.getUserId());
}

//清除掉全部缓存

@CacheEvict(value="andCache",allEntries=true)
public final void EvictUsers(String[] reservedUsers) {
System.out.println("hello andCache deleteall");
}

Spring3集成了ehcache缓存。

第一步:配置Spring文件,声明支持缓存和支持注解

13 <?xml version="1.0" encoding="UTF-8"?>

14 <beans xmlns="http://www.springframework.org/schema/beans"

15 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"

16 xmlns:cache="http://www.springframework.org/schema/cache"

17 xsi:schemaLocation="

18 http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd

19 http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache-3.1.xsd">

20

21 <!-- 缓存注解声明,使用注解缓存 -->

22 <cache:annotation-driven cache-manager="cacheManager" />

23

24 <!-- 指定ehcache.xml的位置 -->

25 <bean id="cacheManagerFactory"

26 class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"

27 p:configLocation="classpath:/ehcache.xml" />

28

29 <!-- 声明缓存Manager -->

30 <bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager"

31 p:cacheManager-ref="cacheManagerFactory" />

32

33 </beans>

第二步:配置Ehcache文件,定义缓存的具体策略。

34

35

36 <?xml version="1.0" encoding="UTF-8"?>

37

38

39

40

41

42 <ehcache>

43

44

45 <diskStore path="java.io.tmpdir" />

46

47

48 <defaultCache maxElementsInMemory="500" eternal="false"

49

50

51 timeToIdleSeconds="300" timeToLiveSeconds="1200" overflowToDisk="true" />

52

53

54 <cache name="DEFAULT_CACHE" maxElementsInMemory="5000" eternal="false"

55

56

57 timeToIdleSeconds="500" timeToLiveSeconds="500" overflowToDisk="true" />

58

59

60 </ehcache>

61

62

第三步:写一个使用缓存的测试方法:

63 import org.springframework.cache.annotation.Cacheable;

64 //将缓存保存进DEFAULT_CACHE,并使用参数中的userId加上一个字符串(这里使用方法名称)作为缓存的key

65 @Cacheable(value="DEFAULT_CACHE",key="#userId + 'findById'")

66 public SystemUser findById(String userId) {

67 SystemUser user = (SystemUser) dao.findById(SystemUser.class, userId);

68 return user ;

69 }

70

在这里,value = “”,对应了ehcache中的缓存名。

这种写法spring的缓存框架是根据传入进去的参数来判断查找缓存的,比如这里的param等于admin”,缓存后,spring在从ehcacheadmin” 从缓存中取了。

如果你想更自主的控制缓存查找,可以使用key参数。

key使用SPEL语言(Spring开发的类似于jsp中的EL表达式的语言)。Key的默认生成如下:

1. 不提供参数,返回0

2. 只提供一个参数,直接返回该参数

3. 提供多个参数,则返回多个参数进行hash运算之后的结果。

总结:其实spring3的这个cache底层的实现就是和这里一样

只是spring帮我们封装好了。当然spring封装的还是比较好的。

<!--EndFragment-->

转载于:https://my.oschina.net/xiaominmin/blog/1598200

你可能感兴趣的文章
轻松解决“正在连接”无线的故障
查看>>
直接退出程序
查看>>
poj 2481 Cows【线段树单点更新】
查看>>
32位LINUX下hadoop2.2.0重新编译及安装步骤
查看>>
前端开发学习系列之一:准备工作
查看>>
活动目录中的Get-Aduser这个cmdlets调用的是账户的哪个属性?
查看>>
我的友情链接
查看>>
shell中if的参数说明
查看>>
随笔-java注解,反射,枚举
查看>>
jqm two columns
查看>>
我的友情链接
查看>>
一个例子看懂所有nodejs的官方网络demo
查看>>
iOS 分类思想(2)
查看>>
ramdisk的解释
查看>>
linux服务器集群运维经验
查看>>
MyISAM Key Cache详解及优化
查看>>
我所认识的PDF文件处理工具软件---PDF Automation Server(PAS)
查看>>
HDS HDIM:数据保护以管理为核心
查看>>
Hibernate关联映射之延迟加载
查看>>
我的一次华为虚拟化搭建记录:(一)、关于华为虚拟化的架构
查看>>