- 装饰器模式类图
-
cache接口
这就是装饰器和被装饰器需要实现的接口,这也体现了面向接口编程的精妙之处。
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; } }
-
被装饰的对象PerpetualCache
这里省略了其他的方法实现,只要记住二级缓存最终是通过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);
}
}