CacheManager是Ehcache框架的核心類和入口,它負責管理一個或多個Cache對象。要使用Ehcache框架,必須要先創建 CacheManager 對象。現在我們學習下,如何創建 CacheManager 對象。
1.使用默認配置文件創建單例對象
CacheManager提供了很多無參的static創建方法,我們可以獲取唯一的實例,代碼如下:
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個函數就是互相調用的關系。使用這種方式,Ehcahce會報警告,因為我們沒有提供自定義的cache配置文件:
警告: No configuration found. Configuring ehcache from ehcache-failsafe.xml found in the classpath: jar:file:ehcache-2.8.1.jar!/ehcache-failsafe.xml
使用ehcache.jar中默認的緩存配置文件來創建EhcahceManager對象,這種方式實際上使用並不多。默認的配置在大多數情況下,都是不能滿足應用程序的使用需要。不推薦這種使用方式。
2.使用自定義的ehcache.xml創建單例對象
使用默認的緩存配置文件,很可能不能滿足應用的使用,一般來說應用很少會使用默認的ehcache-failsafe.xml 。這個時候,我們可以自己指定ehcache.xml來創建單一CacheManager對象,使用帶有參數的static創建類型的方法。
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.static類型創建方法,有參和無參的區別
CacheManager類static類型的創建方法包括:create()、getInstance()、newInstance(),這些API讓我們可以使用默認的緩存配置文件,也可以使用自定義的配置文件,來創建CacheManager對象。一般來說,我們在應用中不會既使用無參的static創建方法,又使用有參的static創建方法。這種使用方式是不合理的,也是沒有必要。我有點細節控,還是看下能不能同時使用這2種方式。
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.使用構造函數創建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
