深入理解Ehcache系列(二)

        CacheManager是Ehcache的缓存主要管理类.支持单例模式和工厂模式. 主要用于管理Ehcache里面有的Cache.    可以使用CacheManager来创建Cache.

        如:    

CacheManager manager = CacheManager.newInstance("src/config/cache.xml");   
manager.addCache("testCache");
Cache cache = singletonManager.getCache("testCache");
manager.removeCache("testCache");

 

        具体实现如下: 

        单例模式:

/**
     * The Singleton Instance.
     */

    private static volatile CacheManager singleton;

/**
     * A factory method to create a singleton CacheManager with default config, or return it if it exists.
     * <p/>
     * The configuration will be read, {@link Ehcache}s created and required stores initialized. When the {@link CacheManager} is no longer
     * required, call shutdown to free resources.
     *
     * @return the singleton CacheManager
     * @throws CacheException
     *             if the CacheManager cannot be created
     */
    public static CacheManager create() throws CacheException {
        if (singleton != null) {
            LOG.debug("Attempting to create an existing singleton. Existing singleton returned.");
            return singleton;
        }
        synchronized (CacheManager.class) {
            if (singleton == null) {
                singleton = newInstance();
            } else {
                LOG.debug("Attempting to create an existing singleton. Existing singleton returned.");
            }
            return singleton;
        }
    }

public static CacheManager getInstance() throws CacheException {
        return CacheManager.create();
    }

    工厂模式:


CacheManager集合:

private static final Map<String, CacheManager> CACHE_MANAGERS_MAP = new HashMap<String, CacheManager>();

    private static final IdentityHashMap<CacheManager, String> CACHE_MANAGERS_REVERSE_MAP = new IdentityHashMap<CacheManager, String>();

先判断集合中是否存在CacheManger,如里没有,创建一个新的CacheManager并存入集合中.

private static CacheManager newInstance(Configuration configuration, String msg) throws CacheException {
        synchronized (CacheManager.class) {
            String name = configuration.getName();
            if (name == null) {
                name = DEFAULT_NAME;
            }
            CacheManager cacheManager = CACHE_MANAGERS_MAP.get(name);
            if (cacheManager == null) {
                LOG.debug(msg);
                cacheManager = new CacheManager(configuration);//此步会存入集合.
            }
            return cacheManager;
        }
    }


初始化Cache,并添加到ehcaches集合中:


/**
     * Ehcaches managed by this manager.
     */
    private final ConcurrentMap<String, Ehcache> ehcaches = new ConcurrentHashMap<String, Ehcache>();




private Ehcache addCacheNoCheck(final Ehcache cache, final boolean strict) throws IllegalStateException, ObjectExistsException,
            CacheException {

        if (cache.getStatus() != Status.STATUS_UNINITIALISED) {
            throw new CacheException("Trying to add an already initialized cache." + " If you are adding a decorated cache, "
                    + "use CacheManager.addDecoratedCache" + "(Ehcache decoratedCache) instead.");
        }

        if (cache.getCacheConfiguration().isTerracottaClustered() && terracottaClient.getClusteredInstanceFactory() == null) {
            throw new CacheException(String.format("Trying to add terracotta cache %s but no <terracottaConfig> element was " +
                                                   "used to specify the Terracotta configuration on the CacheManager %s.",
                                                    cache.getName(), getName()));
        }

        Ehcache ehcache = ehcaches.get(cache.getName());
        if (ehcache != null) {
            if (strict) {
                throw new ObjectExistsException("Cache " + cache.getName() + " already exists");
            } else {
                return ehcache;
            }
        }

        initializingCaches.put(cache.getName(), cache);
        try {
            initializeEhcache(cache, true);

            ehcache = ehcaches.putIfAbsent(cache.getName(), cache);
            if (ehcache != null) {
                throw new AssertionError();
            }
        } finally {
            initializingCaches.remove(cache.getName());
        }

        // Don't notify initial config. The init method of each listener should take care of this.
        if (status.equals(Status.STATUS_ALIVE)) {
            cacheManagerEventListenerRegistry.notifyCacheAdded(cache.getName());
        }

        return cache;
    }





   


你可能感兴趣的:(CacheManager,Ehcache原理)