`

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

相关推荐

    Spring AOP+ehCache简单缓存系统解决方案

    在这里,我们通过`setCache(Cache cache)`方法注入缓存实例,这通常是由Spring配置文件中配置的bean注入。Spring对ehCache的支持使得集成更加简便,我们可以利用Spring的缓存抽象来管理ehCache实例,包括设置缓存...

    Ehcache例子

    本示例将深入探讨如何使用Ehcache,并通过一个简单的实例来解释其工作原理。 首先,Ehcache的核心组件包括缓存管理器、缓存和缓存项。缓存管理器(CacheManager)是Ehcache的顶级对象,负责创建和管理缓存。缓存...

    开源项目-go-cache-cache.zip

    Go-cache的设计灵感可能来自于其他编程语言中的类似缓存解决方案,如Python的`SimpleCache`或Java的` EhCache`。 在Go语言中,当需要快速访问频繁使用的数据时,使用内存缓存是常见的优化策略。`go-cache`库就是...

    Hibernate5实例程序

    可以使用第三方缓存提供商如Ehcache,通过配置`hibernate.cache.region.factory_class`来启用。 9. **映射文件(Mapping)** `hbm.xml`文件用于定义Java类和数据库表之间的映射关系,包括字段类型、长度、主键生成...

    redis详细文件

    例如,将数据存入缓存使用`set()`方法,从缓存中获取数据使用`get()`方法。 4. 缓存过期策略:Redis支持TTL(Time To Live)机制,可以设置键的过期时间,以控制缓存数据的生命周期。 5. 分布式锁:在分布式环境下...

    Springboot整合redis使用技巧.docx

    Spring Cache 不仅支持使用 SpEL(Spring Expression Language)定义缓存键名及条件判断,而且内置了多种缓存实现的支持,如 EhCache 和 Redis 等。 #### 二、Spring Cache 核心接口 Spring 提供的核心 `Cache` ...

    基于redis的缓存框架

    Spring Cache是Spring框架的一个模块,提供了统一的缓存抽象,可以与多种缓存提供商(如Redis、Ehcache等)集成。然而,Spring Cache的配置相对复杂,且在某些特定场景下可能无法满足需求。因此,我们希望通过自定义...

    jfinal-2.2-manual.pdf参考手册

    **8.3 Redis与Cache** - **功能:** Redis可以作为缓存使用,同时也支持其他高级功能。 **8.4 非web环境使用RedisPlugin** - **功能:** 在非Web环境中也可以使用RedisPlugin。 #### 九、Validator **9.1 概述*...

    在Jsp中怎样清空缓存 了解就可以了

    例如,Ehcache 可以通过 `cacheManager.getCache().removeAll()` 来清除所有缓存项。 总之,清空JSP的缓存涉及到客户端和服务器端的不同层面,理解这些机制有助于我们在开发过程中快速解决因缓存导致的问题。在实际...

    shiro缓存机实例代码

    此外,还有一个 `CacheManager` 接口,用于管理和获取名为 `name` 的特定 `Cache` 实例: ```java public interface CacheManager { public , V> Cache, V> getCache(String name) throws CacheException; } ``` ...

    hibernate-3.2源码包

    Hibernate 是一个著名的开源Java对象关系映射(ORM)框架,它极大地简化了数据库与Java应用程序之间的数据交互。在 Hibernate 3.2 版本中,它引入了许多改进和新特性,使得开发人员能够更加高效地处理数据库操作。...

    中级程序员必备面试题.txt

    response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); response.setHeader("Pragma", "no-cache"); response.setDateHeader("Expires", 0); ``` #### Redis与EHCache的区别及Redis如何...

    Nhibernate

    例如,可以使用第三方缓存提供者如 EhCache 或 Redis。 14. **性能优化**:Nhibernate提供了多种性能优化手段,包括批处理(Batch Size)、缓存策略、延迟加载的控制以及避免N+1查询问题等。 在实际项目中,结合...

    详解shiro缓存机制

    CacheManager 接口负责创建和管理 Cache 实例,根据指定的名称获取缓存。 **Shiro 的缓存管理器感知接口(CacheManagerAware)** ```java public interface CacheManagerAware { void setCacheManager...

    Hibernate 小例子

    Hibernate 支持一级缓存(Session 缓存)和二级缓存(可选,如 Ehcache)。一级缓存是默认开启的,每个 `Session` 内部维护了一个缓存,用于存储已加载的对象,提高性能。二级缓存则可以在多个 `Session` 之间共享,...

Global site tag (gtag.js) - Google Analytics