闲着没事研究aop实现查询缓存,闷头敲代码,敲出了以下东西,希望看到的大神指正!
一、自定义注解
通过自定义注解,在修饰的方法上添加该注解,在aop中切入,为该方法添加缓存到redis中
package com.wwy.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 自定义缓存注解
* @author wwy
* @date 2019年12月13日
* @version v0.0.1
*
*/
@Retention(RetentionPolicy.RUNTIME)//声明注解何时起作用(运行时)
@Target({
ElementType.METHOD,//声明注解作用的位置(方法)
ElementType.TYPE})//声明注解作用的位置(类、接口、枚举)
public @interface Cache {
/**
* 名称
* @return
*/
String[] value() default"";
/**
* 写入还是读取
*
* @return
*/
boolean read() default true;
}
注解的value属性用于指定方法操作的数据库的名字,以便于后面再更新数据库数据时准确清楚缓存避免脏读,read属性指定该方法是读操作还是写操作,以便于后面切面中判断是要添加缓存还是清除缓存!
二、AOP
1.定义切面类,使用环绕通知,切入点为自定义注解修饰的方法,
2.利用全类名+方法名+数据库名作为redis中的key,
3.判断如果修饰方法的注解的read属性值为true,则先在缓存中查询,如果缓存中没有就在数据库中查询,然后把数据添加到缓存中
4.如果修饰方法的注解的read属性值为false,则遍历value属性,删除没有个包含value值得redis缓存
代码如下:
package com.wwy.aop;
import java.io.IOException;
import java.lang.annotation.Annotation;
import java.util.Set;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;
import com.wwy.annotation.Cache