抽象类适合封装缓存读写核心流程,通过定义cacheKey()、loadFromSource()、toCacheValue()、fromCacheValue()等抽象方法强制子类实现差异化逻辑,并利用泛型CacheLoader<T>确保类型安全与序列化适配,同时提供cacheTimeoutSeconds()及异常兜底机制增强健壮性。

抽象类适合封装缓存读写的核心流程(如查缓存→查DB→回填缓存),把可变部分(如缓存键生成、数据加载、实体转换)定义为抽象方法,强制子类实现,从而统一缓存行为又保留业务灵活性。
定义抽象缓存操作骨架
在抽象类中固定「先查缓存、缓存未命中则加载数据、成功后写入缓存」的标准流程,避免子类重复编写模板代码。关键点是把差异逻辑抽成抽象方法:
- cacheKey():由子类决定缓存键如何拼接(如 user:123、order:202405:status)
- loadFromSource():子类实现具体的数据源加载(JDBC、Feign、MyBatis等)
- toCacheValue(T):子类决定对象是否需序列化/脱敏/压缩后再存入缓存
- fromCacheValue(byte[]):子类负责反序列化或构造领域对象
用泛型统一类型处理
声明为 abstract class CacheLoader<T>,让子类明确指定要缓存的业务类型(如 User、Order)。这样:
- 抽象类内部可安全调用
T t = loadFromSource(),无需强转 - 缓存读写时自动适配序列化器(如 FastJSON 对
User类型的 writeValueAsBytes / parseObject) - IDE 能提供完整类型提示,降低误用风险
支持缓存策略与异常兜底
在抽象类中预留可配置项和默认行为,提升健壮性:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
- 提供
cacheTimeoutSeconds()抽象方法,子类按业务设定 TTL(用户信息 30 分钟,配置项 24 小时) - 对
loadFromSource()异常做统一捕获,记录 warn 日志并抛出运行时异常,避免静默失败 - 空结果也写入缓存(如 null 或空集合),设置较短过期时间(如 2 分钟),防止缓存穿透
子类只需关注业务语义
继承后,子类代码极简,只表达“我要缓存什么、从哪来、怎么存”:
public class UserCacheLoader extends CacheLoader<User> {
@Override
protected String cacheKey(Long userId) {
return "user:" + userId;
}
@Override
protected User loadFromSource() {
return userMapper.selectById(userId); // 真实 DB 查询
}
@Override
protected byte[] toCacheValue(User user) {
return JSON.toJSONString(user).getBytes(UTF_8); // 自定义序列化
}
@Override
protected User fromCacheValue(byte[] data) {
return JSON.parseObject(new String(data, UTF_8), User.class);
}
@Override
protected int cacheTimeoutSeconds() {
return 1800; // 30 分钟
}
}
调用方只需 new 出实例并调用 load(userId),缓存逻辑完全透明。

















