自定义注解
- 自定义注解
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Cache_Find {
String key() default "";
int seconds() default 0;
}
- 对自定义注解的逻辑定义切面
@Aspect
@Component
public class CacheAspect {
@Autowired(required = false)
private JedisCluster jedis;
@Around("@annotation(cacheFind)")
public Object around(ProceedingJoinPoint joinPoint, Cache_Find cacheFind) {
Object data = null;
String key = getKey(joinPoint,cacheFind);
String result = jedis.get(key);
try {
if(StringUtils.isEmpty(result)) {
data = joinPoint.proceed();
String json = ObjectMapperUtil.toJSON(data);
if(cacheFind.seconds()>0) {
int seconds = cacheFind.seconds();
jedis.setex(key,seconds, json);
}else {
jedis.set(key,json);
}
System.out.println("AOP查询数据库!!!!!");
}else {
Class returnClass = getReturnClass(joinPoint);
data = ObjectMapperUtil.toObject(result,returnClass);
System.out.println("AOP查询缓存!!!!");
}
} catch (Throwable e) {
e.printStackTrace();
throw new RuntimeException(e);
}
return data;
}
private Class getReturnClass(ProceedingJoinPoint joinPoint) {
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
return signature.getReturnType();
}
private String getKey(ProceedingJoinPoint joinPoint, Cache_Find cacheFind) {
String key = cacheFind.key();
if(StringUtils.isEmpty(key)) {
String className = joinPoint.getSignature().getDeclaringTypeName();
String methodName = joinPoint.getSignature().getName();
if(joinPoint.getArgs().length>0)
key = className+"."+methodName+"::" + joinPoint.getArgs()[0];
else
key = className+"."+methodName;
}
return key;
}
}
- 切面中使用到的一个工具类ObjectMapperUtil
public class ObjectMapperUtil {
private static final ObjectMapper MAPPER = new ObjectMapper();
public static String toJSON(Object data) {
String json = null;
try {
json = MAPPER.writeValueAsString(data);
} catch (JsonProcessingException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
return json;
}
@SuppressWarnings("unchecked")
public static <T> T toObject(String json,Class<T> target) {
T obj = null;
try {
obj = MAPPER.readValue(json, target);
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
return obj;
}
}