cacheable 将一个对象作为key
@Cacheable(value = {"userLogs"}, keyGenerator = "cacheKeyGenerator" )
package com.opencloud.common.configuration;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cache.interceptor.KeyGenerator;
import org.springframework.cache.interceptor.SimpleKey;
import org.springframework.stereotype.Component;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
// 缓存key 生成器
@Slf4j
@Component
public class CacheKeyGenerator implements KeyGenerator {
@Override
public Object generate(Object target, Method method, Object... params) {
if(params.length == 0){
return SimpleKey.EMPTY;
}
StringBuilder key = new StringBuilder();
for (Object param : params) {
//此处处理的是一个对象 如果是Map需自行验证是否可行
Field[] fields = getAllFields(param.getClass());
for(Field field:fields) {
//抑制Java对修饰符的检查
field.setAccessible(true);
try {
// log.info("fieldName:{} fieldVuale:{}",field.getName(),field.get(param));
key.append(field.getName()+"="+field.get(param)+" , ");
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
return key;
}
/**
* 获取本类以及父类的属性方法
* @param clazz 当前类对象
* @return 字段数组
*/
private static Field[] getAllFields(Class<?> clazz){
List<Field> fieldList = new ArrayList<>();
while (clazz != null){
fieldList.addAll(new ArrayList<>(Arrays.asList(clazz.getDeclaredFields())));
clazz = clazz.getSuperclass();
}
Field[] fields = new Field[fieldList.size()];
return fieldList.toArray(fields);
}
}
上一篇: cacheable 将一个对象作为key
下一篇: docker nginx 挂载
推荐阅读
-
jquery将一个表单序列化为一个对象的方法
-
如何将一个EXCEL文件作为二进制文件存入数据库,再把它读取打开?
-
微服务架构下使用Spring Cloud Zuul作为网关将多个微服务整合到一个Swagger服务上
-
Word中双击格式刷实现连续使用将多个对象格式变为一个样式
-
将xml文件作为一个小的数据库,进行学生的增删改查的简单实例
-
Android studio将一个项目作为module导入另一个项目
-
android studio将一个项目作为module(library)导入到另一个项目
-
Java 遍历一个对象的属性 将非空属性赋值给另一个对象
-
向一个对象数组里面添加新的属性 + 将一个对象数组数据拿出来变成另一个对象
-
cacheable 将一个对象作为key