1、实现效果
当一个请求线程多次请求A方法时,只会触发一次A方法的实际调用,会将方法结果缓存起来,避免多次调用。
2、实现过程
1. 需要一个注解ThreadLocalCache,在需要缓存的方法上加上该注解
2. 需要一个切面,借助ThreadLocal,将结果缓存起来,利用环绕通知来实现方法拦截从缓存中返回方法执行结果
3、代码实现
3.1、ThreadLocalCache注解创建
作用于方法级别
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ThreadLocalCache {
}
3.2、ThreadLocalTestAspect切面创建
@Aspect
@Component
public class ThreadLocalTestAspect {
private ThreadLocal<Map<Object, Object>> threadLocal = new ThreadLocal<>();
@Around("@annotation(com.example.test.ThreadLocalCache)")
private Object myPointcut(ProceedingJoinPoint proceedingJoinPoint) {
//获取方法的入参
Object[] args = proceedingJoinPoint.getArgs();
Signature signature = proceedingJoinPoint.getSignature();
//获取目标方法名
String name = signature.getName();
//获取目标方法的类的完全限定名
String declaringTypeName = signature.getDeclaringTypeName();
//生成缓存key
Object key = SimpleKeyGenerator.generateKey(args, declaringTypeName, name);
if (Objects.isNull(threadLocal.get())