抽象类通过模板方法和泛型Supplier封装缓存逻辑,定义getCacheKey()、doRealWork()等抽象方法及cachedExecute()通用入口,结合CacheProvider接口解耦实现,支持Caffeine/Redis等;可协同Spring @Cacheable实现声明式缓存。

在抽象类中实现通用的缓存代理包装逻辑,核心思路是:**把缓存策略(如 key 生成、过期时间、缓存读写)封装为可复用的模板,再通过模板方法或委托机制让子类专注业务逻辑,而非重复写缓存代码**。Java 本身不支持在抽象类中直接生成代理(如 JDK 动态代理需基于接口),但可以通过组合 + 模板方法 + `Supplier
用模板方法定义缓存执行流程
抽象类定义「先查缓存 → 缓存未命中则执行业务 → 写入缓存」的标准流程,子类只需提供具体业务逻辑和缓存参数:
- 声明抽象方法 getCacheKey() 和 doRealWork(),由子类实现
- 定义受保护的 cacheTTL() 方法,默认返回 60 秒,子类可覆写
- 提供 final 的 executeWithCache() 方法,内部调用缓存工具(如 Caffeine、RedisTemplate)完成闭环
用泛型 + Supplier 封装可缓存的业务执行
避免为每个方法写重复代理逻辑,抽象类提供一个通用入口:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 定义 <R> R cachedExecute(String key, Supplier<R> supplier)
- 内部使用 Caffeine 或 Spring Cache 抽象层(如
CacheManager)读写 - 子类调用时只需传 key 和业务 lambda:
cachedExecute("user:" + id, () -> userDao.findById(id))
结合 Spring AOP 实现声明式缓存(推荐配合抽象类使用)
虽然抽象类本身不生成代理,但可以与 Spring 的 @Cacheable 协同设计:
立即学习“Java免费学习笔记(深入)”;
- 抽象类提供 cacheName() 和 cacheKeyGenerator() 等钩子方法
- 子类继承后,在具体方法上标注
@Cacheable(cacheNames = "#root.target.cacheName()", key = "#root.target.cacheKey(#id)") - Spring 在运行时自动织入代理,抽象类只负责统一配置逻辑,不侵入缓存实现细节
避免硬编码缓存客户端,依赖抽象缓存接口
解耦缓存实现,让抽象类只面向接口编程:
- 定义 CacheProvider<K, V> 接口(含
get(key)、put(key, value, ttl)等) - 抽象类持有
protected final CacheProvider<String, Object> cache,构造时注入 - 子类可自由选择 Caffeine、Redis、甚至内存 Map 实现该接口,不影响抽象逻辑

















