mybatis源碼分析之cache建立

來源:互聯網
上載者:User

標籤:style   java   io   for   cti   re   

   XMLMapperBuilder.java  

//解析<cache /> 配置元素,建立cache對象private void cacheElement(XNode context) throws Exception {    if (context != null) {      String type = context.getStringAttribute("type", "PERPETUAL");      Class<? extends Cache> typeClass = typeAliasRegistry.resolveAlias(type);      String eviction = context.getStringAttribute("eviction", "LRU");      Class<? extends Cache> evictionClass = typeAliasRegistry.resolveAlias(eviction);      Long flushInterval = context.getLongAttribute("flushInterval");      Integer size = context.getIntAttribute("size");      boolean readWrite = !context.getBooleanAttribute("readOnly", false);      Properties props = context.getChildrenAsProperties();      builderAssistant.useNewCache(typeClass, evictionClass, flushInterval, size, readWrite, props);}

  CacheBuilder.java

//建立對象工作public Cache useNewCache(Class<? extends Cache> typeClass,      Class<? extends Cache> evictionClass,      Long flushInterval,      Integer size,      boolean readWrite,      Properties props) {    typeClass = valueOrDefault(typeClass, PerpetualCache.class);    evictionClass = valueOrDefault(evictionClass, LruCache.class);    //這裡構建 Cache 執行個體採用 Builder 模式,每一個 Namespace 產生一個  Cache 執行個體    Cache cache = new CacheBuilder(currentNamespace)        .implementation(typeClass)        .addDecorator(evictionClass)        .clearInterval(flushInterval)        .size(size)        .readWrite(readWrite)        .properties(props)        .build();    configuration.addCache(cache);    currentCache = cache;    return cache;  }

//build 建立執行個體方法public Cache build() {    setDefaultImplementations();    Cache cache = newBaseCacheInstance(implementation, id);    setCacheProperties(cache);    //如果是自己自訂的緩衝,則不應用預設的裝飾器cache類    if (PerpetualCache.class.equals(cache.getClass())) { // issue #352, do not apply decorators to custom caches      for (Class<? extends Cache> decorator : decorators) {        cache = newCacheDecoratorInstance(decorator, cache);        setCacheProperties(cache);      }      //設定標準裝飾器類      cache = setStandardDecorators(cache);    } else if (!LoggingCache.class.isAssignableFrom(cache.getClass())) {      cache = new LoggingCache(cache);    }    return cache;  }


//設定標準緩衝裝飾器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 = new LoggingCache(cache);      cache = new SynchronizedCache(cache);      return cache;    } catch (Exception e) {      throw new CacheException("Error building standard cache decorators.  Cause: " + e, e);    }  }



聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.