本文基于dubbo 2.7.5版本代码
服务结果缓存工厂CacheFactory接口详解
一、CacheFactory详解
dubbo提供的CacheFactory一共有四个:
- ThreadLocalCacheFactory
- JCacheFactory
- LruCacheFactory
- ExpiringCacheFactory
dubbo会根据@Reference注解中设置的cache值,找到上面对应的CacheFactory实现类,对应的cache属性配置值分别是“threadlocal”、“jcache”、“lru”、“expiring”。
CacheFactory实现类用于创建对应的Cache对象。比如LruCacheFactory用于创建LruCache对象。LruCache实现了Cache接口,负责对数据的缓存。
public class LruCacheFactory extends AbstractCacheFactory {
@Override
protected Cache createCache(URL url) {
return new LruCache(url);//创建LruCache对象
}
}
二、AbstractCacheFactory详解
上面提到的四个类共同的基类是AbstractCacheFactory。这个类的主要代码如下:
private final ConcurrentMap<String, Cache> caches = new ConcurrentHashMap<String, Cache>();
@Override
public Cache getCache(URL url, Invocation invocation) {
url = url.addParameter(METHOD_KEY, invocation.getMethodName());//在url中添加需要访问的远程服务的方法名
String key = url.toFullString();//相当于远程服务注册到注册中心的url
Cache cache = caches.get(key);
if (cache == null) {
caches.put(key, createCache(url));
cache = caches.get(key);
}
return cache;
}
caches属性记录了本工厂对象所有的Cache对象,每个远程服务提供者的每个方法对应一个Cache对象。如果caches中不存在Cache对象,调用createCache方法创建Cache对象,比如LruCacheFactory的createCache方法用于创建LruCache。