`

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就很自然而流畅地解决了类型匹配问题.

5
0
分享到:
评论
2 楼 rmn190 2011-10-20  


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

1 楼 qingfeng825 2011-10-20  
呵呵,楼主的学习方法很好,我要借鉴,
直接看源码,
我一般学习这些东西都是直接看官方文档,看得差不多了有问题解决不了才会看源码,
但是这样感觉离源码远了一些。

相关推荐

Global site tag (gtag.js) - Google Analytics