1.@Cacheable注解:spring支持的数据缓存
1>cacheNames(value):文件夹的名称
2>condition=false时,不读取缓存,直接执行方法体,并返回结果,同时返回结果也不放入缓存。
condition=true时,读取缓存,有缓存则直接返回。无则执行方法体,同时返回结果放入缓存(如果配置了result,且要求不为空,则不会缓存结果因为这个注解在进入方法前去检测condition,而这时还没有result,会造成result为null的情况。)。
3>unless属性是指当满足条件时不缓存,不满足条件时缓存,需满足SpEL表达式
名称 描述 示例
methodName 被调用的方法名称 #root.methodName
Method 被调用的方法 #root.method.name
Target 当前被调用的目标对象 #root.target
targetClass 当前被调用的目标对象类 #root.targetClass
args 被调用方法的参数列表 #root.args[0]
caches 调用的缓存列表 #root.caches[0].name
argument name 方法的参数名称可以直接使用#参数名 #p0,#a0等等
result 执行方法后的返回值 #result
若不进行任何配置,默认缓存为concurrentMap,若.properties文件里配置了redis,则缓存在redis里
SpEL 字面量:
整数:#{8}
小数:#{8.8}
科学计数法:#{1e4}
String:可以使用单引号或者双引号作为字符串的定界符号。
Boolean:#{true}
SpEL引用bean , 属性和方法:
引用其他对象:#{car}
引用其他对象的属性:#{car.brand}
调用其它方法 , 还可以链式操作:#{car.toString()}
调用静态方法静态属性:#{T(java.lang.Math).PI}
SpEL支持的运算符号:
算术运算符:+,-,*,/,%,^(加号还可以用作字符串连接)
比较运算符:< , > , == , >= , <= , lt , gt , eg , le , ge
逻辑运算符:and , or , not , |
if-else 运算符(类似三目运算符):?:(temary), ?:(Elvis)
正则表达式:#{admin.email matches ‘[a-zA-Z0-9._%±]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}’}
@Cacheable不能配置 condition = “#result != null” ,因为这个注解在进入方法前去检测condition,而这时还没有result,会造成result为null的情况。
@CacheEvict 想要需要配置condition = "#result != null"时 ,同时需要配置 beforeInvocation = false。beforeInvocation 的意思为 是否在方法执行前就删除缓存,缺省为 false。如果不配置这两个,会造成方法返回为空时,也会删除缓存,但是返回值都为空了,还会不会有缓存呢?所以这个看具体情况了。
@Cacheput 使用condition = “#result != null” 没问题。但是如果像我这样配置的key
key = “‘roomId_’+ #result.id”
则需要配置 condition = “#result != null” ,否则当result为Null时,会报异常。
@CacheConfig 类级别的注解
主要用于配置该类中会用到的一些共用的缓存配置。在这里@CacheConfig(cacheNames = “users”):配置了该数据访问对象中返回的内容将存储于名为users的缓存对象中,我们也可以不使用该注解,直接通过@Cacheable自己配置缓存集的名字来定义。
1>cacheManager:用于指定使用哪个缓存管理器,非必需。只有当有多个时才需要使用
2>cacheResolver:用于指定使用那个缓存解析器,非必需。需通过org.springframework.cache.interceptor.CacheResolver接口来实现自己的缓存解析器,并用该参数指定。
@CachePut
更新和加入使用和@Cacheable相似,@Cacheable第一次执行方法体中的内容,以后直接从缓存中读取,而@Cacheput每一次都执行方法体,可以和@Cacheable 结合使用,CachePut进行数据的更新,Cacheable从缓存中读取更新的数据,与要注意的是结合使用key相同
@CacheEvict
根据key值删除数据,当allEntries=true表示删除缓存中的所有数据