Spring @Cacheable注解在依赖项目启用LTW时的工作机制咨询
@Cacheable注解在依赖Jar+LTW场景下的处理流程
以下是你描述场景中,@Cacheable注解从启动到方法调用的完整处理流程:
1. 新项目启动:缓存与LTW初始化
- 新项目启动时,Spring会优先加载自身定义的缓存配置(比如标注
@EnableCaching的配置类、自定义的CacheManagerBean等),完成缓存基础设施的初始化,这一步会确定后续缓存操作使用的缓存实现(比如Redis、Caffeine等)。 - 同时,因为启用了LTW加载时织入,Spring会初始化对应的织入器(基于AspectJ实现),注册缓存相关的切面逻辑,准备在类加载环节介入。
2. 依赖Jar类加载:织入缓存切面
- 当新项目第一次调用依赖Jar中的
Cached()方法时,JVM会触发该方法所在类的加载流程。 - LTW织入器会拦截这个类的加载过程,扫描类中所有方法的注解,发现
Cached()方法带有@Cacheable注解后,会动态修改该类的字节码,把缓存切面逻辑织入到方法的调用链路中。- 不同于Spring默认的运行时动态代理,LTW是在类加载阶段完成织入,所以不管
Cached()方法是被外部调用还是内部调用,缓存逻辑都会生效。
- 不同于Spring默认的运行时动态代理,LTW是在类加载阶段完成织入,所以不管
3. 方法调用:缓存逻辑执行
- 当
Cached()方法被调用时,织入的缓存切面会先执行:- 根据
@Cacheable注解指定的cacheNames、key等参数,从新项目初始化的CacheManager中获取对应的缓存实例。 - 生成缓存Key并查询缓存:
- 如果缓存命中,直接返回缓存中的值,不会执行原
Cached()方法的业务逻辑。 - 如果缓存未命中,执行原
Cached()方法的业务逻辑,将返回值存入指定缓存后,再把结果返回给调用方。
- 如果缓存命中,直接返回缓存中的值,不会执行原
- 根据
- 这里的核心是:缓存的实际使用完全遵循新项目的缓存配置,依赖Jar只提供带注解的方法定义,不会影响缓存的实现选择。
4. 后续调用:缓存复用
- 后续再次调用
Cached()方法时,会重复上述缓存查询逻辑,只要缓存未过期、未被手动清除,就会直接返回缓存值,跳过方法的业务逻辑执行。
内容的提问来源于stack exchange,提问作者Stotra
相关产品推荐
相关产品推荐

