ThreadLocal加切面实现线程级别的方法缓存

文章介绍了如何使用SpringAOP和ThreadLocal实现方法请求的缓存,当一个请求线程多次调用带有@ThreadLocalCache注解的方法时,只执行一次实际调用并存储结果。文章详细描述了注解、切面的创建以及如何确保线程结束后清除缓存以保持正确的行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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())
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值