首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Spring5 @Cacheable不工作,即使拦截器调用在堆栈上也是如此

Spring5 @Cacheable是Spring框架中的一个注解,用于实现方法级别的缓存。当使用@Cacheable注解标记一个方法时,Spring会在方法执行前先检查缓存中是否存在该方法的返回值,如果存在则直接返回缓存中的结果,而不执行方法体内的代码。

然而,有时候我们可能会遇到@Cacheable不起作用的情况,即使拦截器调用在堆栈上也是如此。这可能是由于以下几个原因导致的:

  1. 缓存配置问题:首先,我们需要确保已正确配置了缓存管理器。在Spring中,可以使用不同的缓存管理器,如Ehcache、Redis等。我们需要根据项目需求选择适合的缓存管理器,并正确配置在Spring的配置文件中。
  2. 方法参数问题:@Cacheable注解默认使用方法的参数作为缓存的key,如果方法的参数没有正确实现equals和hashCode方法,可能会导致缓存无法正确命中。确保方法参数正确实现了equals和hashCode方法,或者使用自定义的key生成器来生成缓存的key。
  3. 异常处理问题:@Cacheable注解默认只在方法执行成功时才会将结果缓存起来,如果方法抛出了异常,则不会进行缓存。如果希望在方法抛出异常时也进行缓存,可以使用@Cacheable的exception属性来指定需要缓存的异常类型。
  4. AOP代理问题:@Cacheable注解是通过AOP代理实现的,如果方法调用是在同一个类中的其他方法内部进行的,而不是通过代理对象调用的,那么@Cacheable注解可能无法生效。确保方法调用是通过代理对象进行的,可以使用Spring的依赖注入来获取代理对象。

综上所述,当遇到Spring5 @Cacheable不工作的情况时,我们可以检查缓存配置、方法参数、异常处理和AOP代理等方面的问题。根据具体情况进行排查和调试,以确保@Cacheable注解能够正常工作。

腾讯云相关产品和产品介绍链接地址:

  • 腾讯云缓存Redis:https://cloud.tencent.com/product/redis
  • 腾讯云分布式缓存Memcached:https://cloud.tencent.com/product/memcached
  • 腾讯云云函数SCF:https://cloud.tencent.com/product/scf
  • 腾讯云API网关:https://cloud.tencent.com/product/apigateway
  • 腾讯云数据库TencentDB:https://cloud.tencent.com/product/cdb
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【小家Spring】高性能关键技术之---体验Spring MVC的异步模式(Callable、WebAsyncTask、DeferredResult) 基础使用篇

Spring5。...,绝大多数Web服务器都如此般处理。这里面有几个关键的点:简单示例图如下 ?...此处需要明晰一个概念:比如tomcat,它既是一个web服务器,同时它也是个servlet后端容器(ava后端服务),所以要区分清楚这两个概念。...错误回、完成回都是通过这个拦截器实现的 CallableProcessingInterceptor getInterceptor() { return new CallableProcessingInterceptor...所以我们在书写preHandler的时候,一定要特别的注意,要让preHandler即使执行多次,也不要受到影响(幂等) 异步拦截器 AsyncHandlerInterceptor、CallableProcessingInterceptor

2.8K50

重学SpringBoot系列之Spring cache详解

除了最后一个CacheConfig外,其余四个都可以用在或者方法级别上,如果用在,就是对该类的所有public方法生效,下面分别介绍一下这几个注解。...这个注解一般用在查询方法。 value、cacheNames:两个等同的参数(cacheNames为Spring 4新增,作为value的别名),用于指定缓存存储的集合名。...但这几个注解通常都是作用在方法的,而有些配置可能又是一个类通用的,这种情况就可以使用@CacheConfig了,它是一个类级别的注解,可以在类级别上配置cacheNames、keyGenerator、...Spring Cache使用的是一个叫做CacheInterceptor的拦截器。我们如果加了缓存相应的注解,就会走到这个拦截器。...这里的condition也是@Cacheable中定义的一个配置,它是一个EL表达式,比如我们可以这样用来缓存id大于1的Book: @Override @Cacheable(cacheNames =

1.2K11

Spring Aop、拦截器、过滤器的区别

Filter也是AOP的一种实现。 Interceptor Interceptor (拦截器),是Struct2中的概念。同样是AOP的一种实现。...拦截器只能对action起作用,而过滤器可以对几乎所有的请求起作用(可以保护资源)。 拦截器可以访问action上下文,堆栈里面的对象,而过滤器不可以。...拦截器和过滤器的区别: 1、拦截器是基于Java的反射机制,过滤器是基于java的函数回   2、拦截器不依赖于servlet容器,而过滤器依赖于servlet容器   3、拦截器只能对action...简化操作;同时还可进行逻辑判断,如用户是否已经登陆、有没有权限访问该页面等等工作。...filter 流程是线性的, url传来之后,检查之后,可保持原来的流程继续向下执行,被下一个filter, servlet接收等. 2.java的拦截器 主要是用在插件,扩展件比如 hivernate

1.3K20

我为什么反对用异常做流程控制?

整虚的,我们用测试数据来说话。...Exception Throw一个普通的包含堆栈信息的Exception 获取/打印异常的堆栈信息 ?...而一旦发生异常,除了昂贵的异常填充堆栈成本,也就是确认下try block对应异常表记录的起止代码行和异常名称是否一致。测试结果也表明确实会有性能波动,但其实很小。 ?...所以即使try的性能损耗很小,但是我们仍旧建议try block的边界越窄越好。 明确概念3:try block的范围即使很宽,对于堆栈深度来说并无特别影响。...,被整合成了“通用系统异常”无法分辨;这时候的拦截器就是个异常中央处理池,拆就是hardcode,拆就可能是浪费了之前的异常细颗粒度; 为了让代码不那么丑陋,自定义的异常通常继承自RuntimeException

3.9K21

【译】JavaScript的工作原理:引擎,运行时和调用堆栈的概述

如果您对JavaScript比较陌生,那么这篇博文将帮助您理解为什么JavaScript与其他语言相比如此“奇怪”。...然后,它还有事件循环和回队列。 调用堆栈 JavaScript是一种单线程编程语言,这意味着它只有一个Call Stack(调用堆栈)。因此,它只能一次做一件事。...在某种程度上,函数调用在调用堆栈的数量超过实际的调用堆栈的大小,浏览器会决定采取行动,通过抛出一个错误,如下: ?...在单个线程运行代码非常简单,因为您不必处理多线程环境中出现的复杂场景 - 例如,死锁。 由于JavaScript只有一个Call Stack,在单个线程运行也是非常有限的。...那么,如何在阻止UI并使浏览器无响应的情况下执行繁重的代码呢? 好吧,解决方案是异步回

1K30

SpringBoot如何快速使用Caffeine缓存?

// 缓存的最大条数 .maximumSize(1000) .build(); } 第一种方式我们就一一介绍了...@Cacheable @Cacheable它是既可以标注在类也可以标注在方法,当它标记在类的时候它表述这个类上面的所有方法都会支持缓存,同样的 当它作用在法上面时候它表示这个方法是支持缓存的。...value 属性 @Cacheable的value属性是必须指定的,其表示当前方法的返回值是会被缓存在哪个Cache的,对应Cache的名称。...使用方法参数时我们可以直接使用“#参数名”或者“#p参数index”这也是我们比较推荐的做法: @Cacheable(value="user", key="#id") public UserDTO...小结 第二种方式是侵入式的,它的实现原理也比较简单就是通过切面的方法拦截器来实现,拦截所有的方法,它的核心代码如下:看起来就跟我们的业务代码差不了多少,感兴趣的也可以去瞅一瞅。

1.3K40

简述struts2拦截器的作用_拦截器什么时候被调用

HOHO 以下是参考资料 struts2自带的配置及其拦截器配置 Struts2 拦截器 [Interceptor] 拦截器工作原理如上图,每一个Action请求都包装在一系列的拦截器的内部...2 在strutx.xml中注册一步中定义的拦截器。...,当一个拦截器堆栈被附加到一个Action的时候,要想Action执行,必须执行拦截器堆栈中的每一个拦截器。...Struts2应用中,根据惯例配置了若干个拦截器堆栈,详细情参看struts-default.xml 其中有一个拦截器堆栈比较特殊,他会应用在默认的每一个Action。...本站仅提供信息存储空间服务,拥有所有权,承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

56920

struts拦截器如何使用_信号拦截器

,最后一定要引用struts2自带的拦截器缺省堆栈defaultStack,否则出错 继承AbstractInterceptor抽象类 我们尝试编写一个Session过滤用的拦截器,该拦截器查看用户...实际,实现方法过滤的拦截器与实现普通拦截器并没有太大的区别,只需要注意两个地方:实现方法过滤的拦截器需要继承MethodFilterInterceptor抽象类,并且重写doIntercept方法定义对...,当一个拦截器堆栈被附加到一个Action的时候,要想Action执行,必须执行拦截器堆栈中的每一个拦截器。...Struts2应用中,根据惯例配置了若干个拦截器堆栈,详细情参看struts-default.xml 其中有一个拦截器堆栈比较特殊,他会应用在默认的每一个Action。...拦截器执行的顺序按照定义的顺序执行 版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,拥有所有权,承担相关法律责任。

56930

玩转Spring Cache --- 扩展缓存注解支持失效时间TTL【享学Spring】

bug,可参考文章:【小家Spring】玩转Spring Cache — @Cacheable/@CachePut/@CacheEvict注解的原理深度剖析和使用 若想在缓存注解指定失效时间,必须具备如下两个基本条件...小细节 针对如上的配置,总结如下两点小细节使时需要注意: 即使禁用前缀disableKeyPrefix(),也是不会影响对应CacheName的TTL(因为TTL针对的是Cache,而不是key) 每个...很多小伙伴是希望把TTL写在key,形如这样书写: @Cacheable(cacheNames = "demoCache",key = "#id_3600") 其实这么想的小伙伴,我觉得根本原因是不太能理解...因此即使你有这种特殊需求,你也可以通过定义特殊的CacheName来实现 若你真想控制到key这种细粒度,我只能说:实现成本太高了且会打破一定的封装性,后续扩展受限 综合来说,不管从场景还是技术,我都是极力推荐这种行为的...总结 本文主要介绍了让缓存注解支持TTL失效时间,提供的两种方式都可以用在生产环境中。合理的使用、控制失效时间,能让你的应用更加的高效,缓存利用得更合理。

8.4K81

在 Android 开发中使用协程 | 背景介绍

所以想让应用运行 “卡”、做到动画能够流畅运行或者能够快速响应用户点击事件,就得让那些耗时的任务阻塞主线程的运行。 要做到处理网络请求不会阻塞主线程,一个常用的做法就是使用回。...其实,是 Kotlin 中的协程提供了这种执行代码而阻塞主线程的方法。 协程在常规函数的基础新增了两项操作。...上述动画展示了 Kotlin 如何使用 suspend 和 resume 来代替回 观察上图中 fetchDocs 的执行,就能明白** suspend** 是如何工作的。...如果需要处理一个函数,且这个函数在主线程执行太耗时,但是又要保证这个函数是主线程安全的,那么您可以让 Kotlin 协程在 Default 或 IO 调度器执行工作。...在 Kotlin 中,所有协程都必须在调度器中运行,即使它们是在主线程运行也是如此。协程可以自行暂停,而调度器负责将其恢复。

1.5K30

【小家Spring】Spring AOP之Advisor、PointcutAdvisor、IntroductionAdvisor、IntroductionInterceptor(引介增强)

切点的实现方式有多种,其中一种就是AspectJ public interface Advisor { //@since 5.0 Spring5以后才有的 空通知 一般当作默认值 Advice...(@Cacheable...等等) public class BeanFactoryCacheOperationSourceAdvisor extends AbstractBeanFactoryPointcutAdvisor...这样,再通过特定的拦截器将新的接口定义以及实现类中的逻辑附加到目标对象。...例子 下面使用一个例子,加深一下对引介增强的了解: // 定义一个新的行为接口,这个行为准备作用在目标对象 public interface IOtherInte { void doOther...它也是我们最常用的Advisor: // 它是一个Advisor,同时也是一个IntroductionInfo public interface IntroductionAdvisor extends

5.3K42

Spring-retry 使用指南

RetryContext包含一些状态来决定是重试还是中止,但是这个状态位于堆栈,不需要将它存储在全局的任何位置,因此我们将此称为无状态重试。...在这些情况下,无状态重试是不够的,因为重新抛出和回滚必然会离开RetryOperations.execute()方法,并可能丢失堆栈的上下文。...如果需要,应该考虑注入具有这些特性的Map,在集群环境中对多个进程的高级使用可能还会考虑使用某种集群缓存实现RetryContextCache(不过,即使在集群环境中,这也可能是多余的)。...重试策略 在RetryTemplate中,execute方法中重试或失败的决定由RetryPolicy决定,RetryPolicy也是RetryContext的工厂。...策略的工作原理是调用分类器将异常转换为委托RetryPolicy,例如,通过将一种异常类型映射到另一种策略,可以在失败之前重试更多次。

1.2K20

本地缓存无冕之王Caffeine Cache

Spring5 (SpringBoot 2.x)后,Spring 官方放弃了 Guava Cache 作为缓存机制,而是使用性能更优秀的 Caffeine 作为默认缓存组件,这对于Caffeine来说是一个很大的肯定...缺点:不能体现数据的访问频率,如果数据最近被访问过,即使访问频度低也不会被淘汰。...因为这些对象的访问次数已经非常高,之后即使不再访问,也不容易被淘汰,可能造成缓存空间的浪费。并且LFU需要维护所有对象的访问计数,这可能会消耗比较多的存储空间和计算资源。...CacheEvict(value = "cache3", allEntries = true)})public User find(Integer id) { return null;}这类注解也可以使用在...在这篇文章中,我们深入探讨了Caffeine Cache以及其淘汰算法的内部工作原理。我们还详细介绍了如何在SpringBoot应用程序中集成Caffeine Cache。

52230

本地缓存无冕之王Caffeine Cache

Spring5 (SpringBoot 2.x)后,Spring 官方放弃了 Guava Cache 作为缓存机制,而是使用性能更优秀的 Caffeine 作为默认缓存组件,这对于Caffeine来说是一个很大的肯定...缺点:不能体现数据的访问频率,如果数据最近被访问过,即使访问频度低也不会被淘汰。...因为这些对象的访问次数已经非常高,之后即使不再访问,也不容易被淘汰,可能造成缓存空间的浪费。并且LFU需要维护所有对象的访问计数,这可能会消耗比较多的存储空间和计算资源。...CacheEvict(value = "cache3", allEntries = true)}) public User find(Integer id) { return null; } 这类注解也可以使用在...在这篇文章中,我们深入探讨了Caffeine Cache以及其淘汰算法的内部工作原理。我们还详细介绍了如何在SpringBoot应用程序中集成Caffeine Cache。

1.2K20
领券