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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值