拦截org.springframework.cache.interceptor.CacheInterceptor#invoke的spring aop

Posted

技术标签:

【中文标题】拦截org.springframework.cache.interceptor.CacheInterceptor#invoke的spring aop【英文标题】:spring aop that intercepts org.springframework.cache.interceptor.CacheInterceptor#invoke 【发布时间】:2015-12-16 09:16:24 【问题描述】:

我尝试了以下代码,但它不起作用:

@Component
@Aspect
@Order(Integer.MAX_VALUE)
public class CacheAspect 

    @Around("execution(public * org.springframework.cache.interceptor.CacheInterceptor.invoke(..))")
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable 
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        //CLASS_CACHE.set(signature.getReturnType());
        return joinPoint.proceed();
    

P.S. 我确定 CacheInterceptor 是一个 Spring 管理的 bean。

【问题讨论】:

什么menas“不起作用”? @Jens CacheInterceptor#invoke 无法被拦截。 为什么要拦截拦截?! @M.Deinum 我想将方法​​信息收集到 ThreadLocal 并在其他地方使用。 但是你真的要拦截拦截器吗? 【参考方案1】:

经过一些实验,我发现用用户定义的弹簧替换CacheInterceptor 内置的弹簧可以解决我的问题。 这是代码,以防有人有类似要求。

  @Configuration
  @EnableCaching
  @Profile("test")
  public class CacheConfig 
    @Bean
    @Autowired
    public CacheManager cacheManager(RedisClientTemplate redisClientTemplate) 
      return new ConcurrentMapCacheManager(redisClientTemplate, "test");
    

    @Bean
    public CacheOperationSource cacheOperationSource() 
      return new AnnotationCacheOperationSource();
    

    @Bean
    public CacheInterceptor cacheInterceptor() 
      CacheInterceptor interceptor = new MyCacheInterceptor();
      interceptor.setCacheOperationSources(cacheOperationSource());
      return interceptor;
    
  

MyCacheInterceptor.java,与CacheAspect共享相同的逻辑:

  public class MyCacheInterceptor extends CacheInterceptor 
    @Override
    public Object invoke(MethodInvocation invocation) throws Throwable 
      Method method = invocation.getMethod();
      //CLASS_CACHE.set(signature.getReturnType());
      return super.invoke(invocation);
    
  

CacheInterceptor bean 中内置的 spring 可以在 ProxyCachingConfiguration 类中找到。

希望对你有帮助。

【讨论】:

这个解决方案帮助我在我的自定义拦截器中使用缓存提供程序 put 方法,这使我能够设置 put 的驱逐时间,这不是 Spring 缓存抽象的一部分 - 我添加了 @Primary on cacheInterceptor() bean 方法,谢谢!

以上是关于拦截org.springframework.cache.interceptor.CacheInterceptor#invoke的spring aop的主要内容,如果未能解决你的问题,请参考以下文章

MyBatis拦截器原理介绍

Okhttp3拦截器-应用拦截器和网络拦截器的区别

安卓手机如何设置短信拦截

struts2 拦截器

Vue 路由拦截、http拦截

C语言 拦截导弹