第一种方式:手动设置
为了便于key的不重复,我们可以手动设置key有类名、方法名、参数等组合
属性名称 | 描述 | 示例 |
methodName | 当前方法名 | #root.methodName |
method | 当前方法 | #root.method.name |
target | 当前被调用的对象 | #root.target |
targetClass | 当前被调用的对象的class | #root.targetClass |
args | 当前方法参数组成的数组 | #root.args[0] |
caches | 当前被调用的方法使用的Cache | #root.caches[0].name |
key = "#root.targetClass.simpleName+':'+#root.methodName+':'+#param"
如下图所示
第二种方式:自定义keyGenerator
1、自定义CacheKeyGenerator 实现KeyGenerator
public class CacheKeyGenerator implements KeyGenerator {
/**
* (非 Javadoc)
* <p>
* Title: generate
* </p>
*
* @param target
* @param method
* @param params
* @return
* @see org.springframework.cache.interceptor.KeyGenerator#generate(java.lang.Object,
* java.lang.reflect.Method, java.lang.Object[])
*/
@Override
public Object generate(Object target, Method method, Object... params) {
StringBuilder key = new StringBuilder();
key.append(target.getClass().getSimpleName()).append(":").append(method.getName()).append(":");
if (params.length == 0) {
return key.toString();
}
for (int i = 0; i < params.length; i++) {
Object param = params[i];
if (param == null || param instanceof LogableParam) {
del(key);
} else if (ClassUtils.isPrimitiveArray(param.getClass())) {
int length = Array.getLength(param);
for (int j = 0; j < length; j++) {
key.append(Array.get(param, j));
key.append(',');
}
} else if (ClassUtils.isPrimitiveOrWrapper(param.getClass()) || param instanceof String) {
key.append(param);
} else {
key.append(param.toString());
}
key.append('-');
}
del(key);
return key.toString();
}
private StringBuilder del(StringBuilder stringBuilder) {
if (stringBuilder.toString().endsWith("-")) {
stringBuilder.deleteCharAt(stringBuilder.length() - 1);
}
return stringBuilder;
}
}
2、配置xml
<cache:annotation-driven cache-manager="cacheManager" key-generator="cacheKeyGenerator"
proxy-target-class="true" />
<bean id="cacheKeyGenerator" class="com.tensoon.util.CacheKeyGenerator"></bean>
3:配置注解
如下图所示