aoocache发布第一个版本0.1.0时,没有考虑到使用aocache的项目对方法缓存的控制需求。
场景
给同事做培训时,同事提到这个需求,他希望能够有方法主动去清理指定方法的缓存:
他的数据是由其他服务启动时提供的,他的方法要根据这些数据进行复杂计算返回结果。
如果其他服务重启了,会刷新这些数据,如果使用aocache提供的方法缓存机制,他就需要有办法能清理这些缓存。
缓存控制
我觉得这个需求很合理有普遍性,于是在最新版本0.4.0增加了缓存控制机制.
以两种方法提供缓存清理功能:
- 直接方法调用方式
- 注解方式
clear()
aocache提供以下两个clear
方法直接清除指定方法/构造方法的调用缓存
/*** 清除{@link Member}对应的缓存,为{@code null}或不存在对应的缓存忽略* @param member*/public void clear(Member member);/*** 清除{@link Member}对应的缓存,为{@code null}或不存在对应的缓存忽略* @param member* @throws NoSuchMethodException 没有找到指定的方法/构造方法*/public void clear(Class<?>clazz,String methodName, Class<?>[]parameterTypes);
@AoClear
aocache提供还提供了通过@AoClear
注解清除缓存的形式,将注解定义在返回类型为void
或boolean
类型的方法上,调用该方法就会自动清除缓存。
如下,@AoClear
各字段用于定义要清除缓存的目标方法(Method)或构造方法(Constructor)
字段名 | 默认值 | 说明 |
---|---|---|
targetClass | Object.class | 目标方法(Method)或构造方法(Constructor)所属的类 |
methodName | 空 | 方法名,为空则清除缓存的目标为构造方法(Constructor) |
parameterTypes | Class<?>[] | 方法或构造方法的参数类型数组 |
支持在同一个方法上定义多个
@AoClear
注解,清除多个方法或构造方法的缓存
清理缓存的切入点在方法调用正常返回时 (@AfterReturning
)。
如果@AoClear
注解定义在返回类型非boolean
的类型方法上,即为强制清理模式,方法返回时直接执行清理动作。
如果@AoClear
注解定义在返回类型为boolean
的类型方法上,即为灵活清理模式,方法返回时返回值为true时才执行清理动作。
@AoCacheablepublic <D extends Date> D parseDateString(String dateStr, Class<D> targetClass) {return DateSupport.parseDateString(dateStr,targetClass);}@AoCacheablepublic <D extends Date> D parseDateString2(String dateStr, Class<D> targetClass) {return DateSupport.parseDateString(dateStr,targetClass);}/**** 多注解支持清理多个缓存*/@AoClears({@AoClear(methodName = "parseDateString",parameterTypes = {String.class,Class.class}),@AoClear(methodName = "parseDateString2",parameterTypes = {String.class,Class.class}) })private void clearForce() {}@AoClear(methodName = "parseDateString",parameterTypes = {String.class,Class.class})private boolean clearTrue() {return true;}@AoClear(methodName = "parseDateString",parameterTypes = {String.class,Class.class})private boolean clearFalse() {return false;}
对于我的同事来说,注解方式更合适他,他可以将@AoClear
注解加在服务心跳侦听器方法上,只要其他服务重新上线,就自动实现缓存清理,除了注解不用多写一行代码。
aoacahe快速入门
关于aocache的使用参见之前的博客《java:aocache:基于aspectJ实现的方法缓存工具》
完整示例
完整的示例参见示例项目 aocache-example的代码:
aocache-example-ctw/src/test/java/com/gitee/l0km/aocache/example/ctw/AocacheCtwClearTest.java的test1Timecost()
测试方法