这就是装饰器和被装饰器需要实现的接口,这也体现了面向接口编程的精妙之处。
public interface Cache {
String getId();
void putObject(Object key, Object value);
Object getObject(Object key);
Object removeObject(Object key);
void clear();
int getSize();
default ReadWriteLock getReadWriteLock() {
return null;
}
}
这里省略了其他的方法实现,只要记住二级缓存最终是通过hashmap实现的
public class PerpetualCache implements Cache {
private final String id;
private final Map<Object, Object> cache = new HashMap<>();
}
装饰器实现了类有很多,我们看懂一个就可以触类旁通了
public class FifoCache implements Cache {
private final Cache delegate;
private final Deque<Object> keyList;
private int size;
public FifoCache(Cache delegate) {
this.delegate = delegate;
this.keyList = new LinkedList<>();
this.size = 1024;
}
}
装饰器持有cache接口的实现类delegate,delegate相当于被装饰的对象,在执行delegate方法之前先执行其他业务逻辑,这样就相当于给delegate赋能了,达到了装饰的目的。
5. 二级缓存类创建流程
二级缓存的持有类是在sessionFactory创建的时候依然调用各种builder生成的
最终每个mapper.xml对应一个cache类放到configure类等待调用
重点看装饰器设置类:
/**
* 根据各种配置条件增加相应的装饰器
* @param cache
* @return
*/
private Cache setStandardDecorators(Cache cache) {
try {
MetaObject metaCache = SystemMetaObject.forObject(cache);
if (size != null && metaCache.hasSetter("size")) {
metaCache.setValue("size", size);
}
if (clearInterval != null) {
cache = new ScheduledCache(cache);
((ScheduledCache) cache).setClearInterval(clearInterval);
}
if (readWrite) {
cache = new SerializedCache(cache);
}
/**
* 装饰cache
*/
cache = new LoggingCache(cache);
cache = new SynchronizedCache(cache);
if (blocking) {
cache = new BlockingCache(cache);
}
return cache;
} catch (Exception e) {
throw new CacheException("Error building standard cache decorators. Cause: " + e, e);
}
}
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。