You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring @Cacheable注解在依赖项目启用LTW时的工作机制咨询

@Cacheable注解在依赖Jar+LTW场景下的处理流程

以下是你描述场景中,@Cacheable注解从启动到方法调用的完整处理流程:

1. 新项目启动:缓存与LTW初始化

  • 新项目启动时,Spring会优先加载自身定义的缓存配置(比如标注@EnableCaching的配置类、自定义的CacheManager Bean等),完成缓存基础设施的初始化,这一步会确定后续缓存操作使用的缓存实现(比如Redis、Caffeine等)。
  • 同时,因为启用了LTW加载时织入,Spring会初始化对应的织入器(基于AspectJ实现),注册缓存相关的切面逻辑,准备在类加载环节介入。

2. 依赖Jar类加载:织入缓存切面

  • 当新项目第一次调用依赖Jar中的Cached()方法时,JVM会触发该方法所在类的加载流程。
  • LTW织入器会拦截这个类的加载过程,扫描类中所有方法的注解,发现Cached()方法带有@Cacheable注解后,会动态修改该类的字节码,把缓存切面逻辑织入到方法的调用链路中。
    • 不同于Spring默认的运行时动态代理,LTW是在类加载阶段完成织入,所以不管Cached()方法是被外部调用还是内部调用,缓存逻辑都会生效。

3. 方法调用:缓存逻辑执行

  • 当Cached()方法被调用时,织入的缓存切面会先执行:
    1. 根据@Cacheable注解指定的cacheNames、key等参数,从新项目初始化的CacheManager中获取对应的缓存实例。
    2. 生成缓存Key并查询缓存:
      • 如果缓存命中,直接返回缓存中的值,不会执行原Cached()方法的业务逻辑。
      • 如果缓存未命中,执行原Cached()方法的业务逻辑,将返回值存入指定缓存后,再把结果返回给调用方。
  • 这里的核心是:缓存的实际使用完全遵循新项目的缓存配置,依赖Jar只提供带注解的方法定义,不会影响缓存的实现选择。

4. 后续调用:缓存复用

  • 后续再次调用Cached()方法时,会重复上述缓存查询逻辑,只要缓存未过期、未被手动清除,就会直接返回缓存值,跳过方法的业务逻辑执行。

内容的提问来源于stack exchange,提问作者Stotra

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 07:55:10