抽象类 abstractcachemanager 实现统一缓存框架,封装 key 构建、空值处理、过期策略及 getorload 模板方法;子类仅需实现 doget/doput/doputnull/buildkey 等存储细节,配合 @cached 注解与 aop 可进一步解耦业务逻辑。

用抽象类实现统一的缓存管理框架,核心是把缓存的通用行为(如 key 构建、过期策略、空值处理)抽到父类,把具体存储(Redis、Caffeine、本地 Map 等)留给子类实现。这样既能复用逻辑,又不绑定具体技术。
定义抽象缓存管理器
创建一个泛型抽象类 AbstractCacheManager
- 统一生成缓存 key(支持 SpEL 表达式或方法签名拼接)
- 自动处理 null 值(存 null 时转为 NullValue 占位对象,避免穿透)
- 统一设置默认过期时间(可被子类覆盖或按业务定制)
- 提供带加载逻辑的 getOrLoad 方法(模板方法模式)
关键模板方法设计
在抽象类中定义不可重写的公共入口,把差异点声明为 abstract 或 protected 方法:
public final V get(K key, Supplier<v> loader) {
String cacheKey = buildKey(key); // 子类可重写 buildKey
V value = doGet(cacheKey); // 必须由子类实现:查缓存
if (value == null) {
value = loader.get();
if (value != null) {
doPut(cacheKey, value, getDefaultExpire()); // 子类实现:写缓存
} else {
doPutNull(cacheKey); // 子类实现:存空标记
}
}
return value;
}</v>
其中 doGet、doPut、doPutNull、buildKey 都是 abstract 或可选重写的 protected 方法。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
子类只需关注存储细节
比如 Redis 实现只需专注序列化、连接、命令调用:
- 重写 doGet:调用
redisTemplate.opsForValue().get(key)并反序列化 - 重写 doPut:调用
redisTemplate.opsForValue().set(key, value, expire, TimeUnit.SECONDS) - 重写 buildKey:加业务前缀,如
"user:info:" + key - 可覆盖 getDefaultExpire 返回不同默认值(如用户信息 30 分钟,配置项 5 分钟)
配合注解简化使用(可选增强)
再配一个 @Cached 注解 + AOP 切面,自动代理方法调用,底层仍走同一个 AbstractCacheManager 子类实例。这样业务代码只写:
@Cached(expire = 60)
public User getUserById(Long id) {
return userMapper.selectById(id);
}
切面解析注解后,调用抽象类的 get(key, loader),真正解耦了缓存逻辑与业务代码。
不复杂但容易忽略的是空值处理和 key 的一致性——这两点必须在抽象层强制约束,否则各子类实现五花八门,就失去“统一框架”的意义了。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










