读书人

Ehcache(3): Cache实例的get与set

发布时间: 2012-11-01 11:11:32 作者: rapoo

Ehcache(三): Cache实例的get与set

?????? 注: 跟笔者其它研究源码的博客一样, Ehcache系列也是基于一个例子来debug地跟踪, 例子详见Ehcache(一): Spring + Ehcache开场白中的附件.如果没有例子作参照,阅读过程中可能有些摸不着头绪.
------------------------------
??
?? ?Ehcache(二): 从EhCacheManagerFactoryBean说起中,我们看到一个EhCacheManagerFactoryBean的创建并由此启用一个CacheManager实例.结合ehcache的配置文件和CacheManager的名字,不难猜出这个实例是管理Cache的.那么这个CacheManager实例用在了哪?配置文件中的org.springframework.cache.ehcache.EhCacheFactoryBean实例的创建中.那么又用这个CacheManager实例做了些什么呢?这得看EhCacheFactoryBean类的afterPropertiesSet方法.

??? 方法afterPropertiesSet中有这么一段代码:

?? ???? if (this.cacheManager.cacheExists(this.cacheName)) {
??? ??? ??? if (logger.isDebugEnabled()) {
??? ??? ??? ??? logger.debug("Using existing EHCache cache region '" + this.cacheName + "'");
??? ??? ??? }
??? ??? ??? this.cache = this.cacheManager.getEhcache(this.cacheName);
??? ??? }
??? 也就是说, cacheManager会检查下配置的cacheName(即,ehcache.xml文件中名为com.rmn190.MethodCache的cache)对应的cache是否已经存在. 如果存在,就直接get出来.

??? 这只是get了下cacheManager中已有的cache,那么那个已有的cache是怎么创建出来的? 也就是本例中的名为com.rmn190.MethodCache的cache的cache是何时/如何创建的?

??? 一番顺藤模瓜后, 找到了ConfigurationHelper类中的createCache(CacheConfiguration cacheConfiguration)方法. 这里真真切切地看到了"new Cache"的调用.

???上面我们深层次地体会到Cache实例的创建并通过cacheManager给get了出来,get出来后,在Spring中就set给了例子中MethodCacheInterceptor类属性cache. 不过这里又有问题了:MethodCacheInterceptor类属性cache是一net.sf.ehcache.Cache类型的,但Spring配置文件中set来的实例是一个org.springframework.cache.ehcache.EhCacheFactoryBean,类型不匹配的,EhCacheFactoryBean与Cache有继承或实现关系? 看源码,没有发现. 那Spring又是怎么解决这个类型不匹配问题的?

??? 我们在EhCacheFactoryBean类实现的接口FactoryBean上找到了答案: getObject和getObjectType. 通过FactoryBean接口定义两个方法给出的信息,Spring就很自然而流畅地解决了类型匹配问题.



我现在的感觉: 只看源码很容易迷失而放弃,只看文档容易走马观花落不到实处而不能深入,于是最好的方式是,宏观上细读文档把握精神,微观上粗看源码有切身体会,这样使用时才能得心应手。

读书人网 >软件架构设计

热点推荐