Redis:利用AOP实现Redis缓存

AOP缓存的实现

自定义注解

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME) //什么时期有效    此处为运行期有效
@Target(ElementType.METHOD) //在方法中使用
public @interface CacheFind {
    //key-value的结构

    //用户必须指定 key
    String key();
    //设定超时时间    默认值为-1,即不需要超时
    int secnds() default -1;
}

使用缓存注解

Redis:利用AOP实现Redis缓存_第1张图片

Redis:利用AOP实现Redis缓存_第2张图片

动态获取注解中的属性

​ 方法1:利用原始APIRedis:利用AOP实现Redis缓存_第3张图片

方法2:利用高级API

Redis:利用AOP实现Redis缓存_第4张图片

方法3:利用AOP语法规范

Redis:利用AOP实现Redis缓存_第5张图片

AOP中的语法规范1:

如果通知方法有参数需要添加,则joinPoint 必须位于第一位.
报错信息: error at ::0 formal unbound in pointcut

AOP中的语法规范3:

​ 如果需要动态接受注解对象,则在切入点表达式中直接写注解参数名称即可

​ 虽然看到的是名称,但是解析时变成了包名.类

代码实现

package com.jt.aop;

import com.jt.annotation.CacheFind;
import com.jt.util.ObjectMapperUtil;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Component;
import redis.clients.jedis.Jedis;

import java.lang.reflect.Method;
import java.util.Arrays;


@Component  //将对象交给Spring容器管理
@Aspect     //标识AOP切面
public class RedisAOP {
    @Autowired
    private Jedis jedis;

    //通知类型的选择--考虑:是否控制目标方法是否执行--是的话,选环绕
    //切入点表达式: 控制注解 @annotation(语法...)

 /*   AOP中的语法规范1.:
            *   如果通知方法有参数需要添加,则joinPoint 必须位于第一位.
            *   报错信息: error at ::0 formal unbound in pointcut
     * AOP中的语法规范3:
            *   如果需要动态接受注解对象,则在切入点表达式中直接写注解参数名称即可
     *   虽然看到的是名称,但是解析时变成了包名.类型*/
    @Around("@annotation(cacheFind)")
    public Object around(ProceedingJoinPoint joinPoint,CacheFind cacheFind) throws Throwable {
        Object result=null;
        //1获取key
        String key = cacheFind.key();
        //System.out.println(key);//ITEM_CAT_PARENTID

        //2动态拼接key 获取参数信息
        String args = Arrays.toString(joinPoint.getArgs());
        key+="::"+args;

        //3redis缓存的实现
        if (jedis.exists(key)){
            
            String json = jedis.get(key);

            MethodSignature methodSignature=(MethodSignature) joinPoint.getSignature();
            Class returnType = methodSignature.getReturnType();
            result = ObjectMapperUtil.toObject(json, returnType);
            System.out.println("AOP使用Redis");

        }else {
            //查询数据库--即执行目标方法
            result=joinPoint.proceed();
            String json = ObjectMapperUtil.toJSON(result);
            if (cacheFind.seconds()>0){
                jedis.setex(key, cacheFind.seconds(), json);
            }else {
                jedis.set(key, json);
                System.out.println("AOP查询数据库");
            }
        }

        return result;
}
}

以上,仅供学习参考

你可能感兴趣的:(笔记,Java基础,java,aop,redis,spring,json)