cache(二)——net.sf.ehcache.CacheManager

 EhCacheManagerFactoryBean通过调用 CacheManager类的静态方法来获取实例,那么先看一下CacheManager类提供的static创建方法吧。

cache(二)——net.sf.ehcache.CacheManager

  1. 使用ehcache.jar中默认的缓存配置文件来创建EhcahceManager对象,调用无参的静态方法:
public static void main(String[] args)
        {
            CacheManager mgr1 = CacheManager.getInstance();
            CacheManager mgr2 = CacheManager.create();
            CacheManager mgr3 = CacheManager.newInstance();

            System.out.println(mgr1 == mgr2);// true
            System.out.println(mgr1 == mgr3);// true
        }

 这3种方式都是等价,获取的唯一实例也是相同的。通过源代码可以很容易的发现,这3个函数就是互相调用的关系。 

2. 使用自定义的ehcache.xml来获取单例对象

URL url = TestCacheManager.class.getClassLoader().getResource("conf/ehcache.xml");
CacheManager mgr1 = CacheManager.create(url);
CacheManager mgr2 = CacheManager.create("src/conf/ehcache.xml");
CacheManager mgr3 = CacheManager.newInstance("src/conf/ehcache.xml");

System.out.println(mgr1 == mgr2);// true
System.out.println(mgr1 == mgr3);// true

 使用CacheManager的static方法,在指定了自定义的缓存配置文件的情况下,创建的仍然是唯一的单例对象。在小规模的应用中,我们可以在ehcache.xml中配置所有需要的<cache>。这样就能够使用一个CacheManager对象,来管理配置文件中的多个<cache>

3.同时使用有参的静态方法和无参的静态方法来获取实例呢?

CacheManager mgr1 = CacheManager.create("src/conf/ehcache.xml");

CacheManager mgr4 = CacheManager.create();
CacheManager mgr5 = CacheManager.getInstance();
CacheManager mgr6 = CacheManager.newInstance();

System.out.println(mgr1 == mgr4);// true
System.out.println(mgr1 == mgr5);// true
System.out.println(mgr1 == mgr6);// false

当使用ehcache.xml创建CacheManager对象的时候,CacheManager中的singleton属性会记录创建的对象值,即创建了CacheManager对象, singleton会记录该单例对象,不再是null ;

CacheManager.create()和CacheManager.getInstance()都会先判断 singleton属性是否为null,如果为null则继续调用newInstance(),如果不为null则直接返回。所以mgr1==mgr4==mgr5;

CacheManager.newInstance();不会判断 singleton是否为null,直接使用默认的ehcache-failsafe.xml,新建一个CacheManager对象,所以mgr1 != mgr 6. 

4. 调用关系如图:

cache(二)——net.sf.ehcache.CacheManager

从图中的调用关系可以看出,所有重载的newInstance()方法都是通过一个私有的重载方法

private static CacheManager newInstance(Configuration configuration, String msg)

来获取实例:这个方法会先根据配置名称configuration.getName()去CACHE_MANAGERS_MAP中查找是否已创建相同配置文件的实例,若已创建则直接返回该实例,若未创建,则调用CacheManager的构造器来new 一个新的实例

5. CacheManager 的构造方法:

cache(二)——net.sf.ehcache.CacheManager

CacheManager m1 = new CacheManager();
System.out.println(m1.getName());

CacheManager m2 = new CacheManager("src/conf/ehcache.xml");
System.out.println(m2.getName());

System.out.println(m1 == m2);// false

// CacheManager m3 = new CacheManager();
// CacheManager m4 = new CacheManager("src/conf/ehcache.xml");

可以看出new出来的对象都是不同实例的,也就是说Ehcache框架支持多个CacheManager对象的情况。特别注意:

同一个缓存配置文件,只能new一个CacheManager对象。如果打开注释代码中的m3 和 m4会报错:

Another CacheManager with same name 'atyManager' already exists in the same VM .Please provide unique names for each CacheManager 

参考Ehcache CacheManager