1.定义注解
@Target({ElementType.TYPE, ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)public @interface AspectCache { String key(); /** * 定义工夫 * * @return 返回int */ int seconds() default 0; CACHE_TYPE cacheType() default CACHE_TYPE.FIND; enum CACHE_TYPE { FIND, UPDATE }}
2.切面类
@Aspect@Component@Slf4jpublic class CacheAspectConfig { private final RedisUtil redisUtil; @Autowired public CacheAspectConfig(RedisUtil redisUtil) { this.redisUtil = redisUtil; } @Around("@annotation(aspectCache)") public Object doAround(ProceedingJoinPoint joinPoint, AspectCache aspectCache) throws Throwable { return aroundMethod(joinPoint, aspectCache); } /** * @param joinPoint 连接点 * @param aspectCache 注解 * @return 返回object * @throws Throwable 异样 */ public Object aroundMethod(ProceedingJoinPoint joinPoint, AspectCache aspectCache) throws Throwable { String redisKey = aspectCache.key() + "::" + Arrays.toString(joinPoint.getArgs()); Object result = null; MethodSignature methodType = (MethodSignature) joinPoint.getSignature(); Class<?> returnType = methodType.getReturnType(); // 计时开始 log.info("-------------执行{}办法开始-----------", joinPoint.getSignature().getName()); Stopwatch started = Stopwatch.createStarted(); switch (aspectCache.cacheType()) { case FIND: // 查问缓存 result = findMethod(joinPoint, redisKey, returnType, aspectCache); break; case UPDATE: // 更新缓存 result = updateMethod(joinPoint, redisKey); break; default: result = findMethod(joinPoint, redisKey, returnType, aspectCache); break; } log.info("-------------执行:{}办法开始,所耗时:{}ms-----------", joinPoint.getSignature().getName(), started.stop()); return result; } /** * @param joinPoint 连接点 * @param key key * @param targetClass 类型 * @param aspectCache 注解对象 * @return object 返回数据 * @throws Throwable 抛出异样 */ private Object findMethod(ProceedingJoinPoint joinPoint, String key, Class<?> targetClass, AspectCache aspectCache) throws Throwable { Object result = null; if (redisUtil.hasKey(key)) { log.info("-----------缓存中有数据,从缓存中取------------"); String json = (String) redisUtil.get(key); result = JSON.toJavaObject(JSONObject.parseObject(json), targetClass); } else { log.info("-----------------查询数据库------------------"); result = joinPoint.proceed(); if (aspectCache.seconds() > ServiceConstants.INTEGER_ZERO) { redisUtil.set(key, JSONObject.toJSONString(result), aspectCache.seconds()); } else { redisUtil.set(key, JSONObject.toJSONString(result)); } } return result; } /** * 更新缓存 * * @param joinPoint 连接点 * @param key key * @return object * @throws Throwable 异样 */ private Object updateMethod(ProceedingJoinPoint joinPoint, String key) throws Throwable { log.info("--------------------删除缓存------------------"); redisUtil.del(key); return joinPoint.proceed(); }}