注: 跟笔者其它研究源码的博客一样, 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就很自然而流畅地解决了类型匹配问题.
分享到:
相关推荐
在这里,我们通过`setCache(Cache cache)`方法注入缓存实例,这通常是由Spring配置文件中配置的bean注入。Spring对ehCache的支持使得集成更加简便,我们可以利用Spring的缓存抽象来管理ehCache实例,包括设置缓存...
本示例将深入探讨如何使用Ehcache,并通过一个简单的实例来解释其工作原理。 首先,Ehcache的核心组件包括缓存管理器、缓存和缓存项。缓存管理器(CacheManager)是Ehcache的顶级对象,负责创建和管理缓存。缓存...
Go-cache的设计灵感可能来自于其他编程语言中的类似缓存解决方案,如Python的`SimpleCache`或Java的` EhCache`。 在Go语言中,当需要快速访问频繁使用的数据时,使用内存缓存是常见的优化策略。`go-cache`库就是...
可以使用第三方缓存提供商如Ehcache,通过配置`hibernate.cache.region.factory_class`来启用。 9. **映射文件(Mapping)** `hbm.xml`文件用于定义Java类和数据库表之间的映射关系,包括字段类型、长度、主键生成...
例如,将数据存入缓存使用`set()`方法,从缓存中获取数据使用`get()`方法。 4. 缓存过期策略:Redis支持TTL(Time To Live)机制,可以设置键的过期时间,以控制缓存数据的生命周期。 5. 分布式锁:在分布式环境下...
Spring Cache 不仅支持使用 SpEL(Spring Expression Language)定义缓存键名及条件判断,而且内置了多种缓存实现的支持,如 EhCache 和 Redis 等。 #### 二、Spring Cache 核心接口 Spring 提供的核心 `Cache` ...
Spring Cache是Spring框架的一个模块,提供了统一的缓存抽象,可以与多种缓存提供商(如Redis、Ehcache等)集成。然而,Spring Cache的配置相对复杂,且在某些特定场景下可能无法满足需求。因此,我们希望通过自定义...
**8.3 Redis与Cache** - **功能:** Redis可以作为缓存使用,同时也支持其他高级功能。 **8.4 非web环境使用RedisPlugin** - **功能:** 在非Web环境中也可以使用RedisPlugin。 #### 九、Validator **9.1 概述*...
例如,Ehcache 可以通过 `cacheManager.getCache().removeAll()` 来清除所有缓存项。 总之,清空JSP的缓存涉及到客户端和服务器端的不同层面,理解这些机制有助于我们在开发过程中快速解决因缓存导致的问题。在实际...
此外,还有一个 `CacheManager` 接口,用于管理和获取名为 `name` 的特定 `Cache` 实例: ```java public interface CacheManager { public , V> Cache, V> getCache(String name) throws CacheException; } ``` ...
Hibernate 是一个著名的开源Java对象关系映射(ORM)框架,它极大地简化了数据库与Java应用程序之间的数据交互。在 Hibernate 3.2 版本中,它引入了许多改进和新特性,使得开发人员能够更加高效地处理数据库操作。...
response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); response.setHeader("Pragma", "no-cache"); response.setDateHeader("Expires", 0); ``` #### Redis与EHCache的区别及Redis如何...
例如,可以使用第三方缓存提供者如 EhCache 或 Redis。 14. **性能优化**:Nhibernate提供了多种性能优化手段,包括批处理(Batch Size)、缓存策略、延迟加载的控制以及避免N+1查询问题等。 在实际项目中,结合...
CacheManager 接口负责创建和管理 Cache 实例,根据指定的名称获取缓存。 **Shiro 的缓存管理器感知接口(CacheManagerAware)** ```java public interface CacheManagerAware { void setCacheManager...
Hibernate 支持一级缓存(Session 缓存)和二级缓存(可选,如 Ehcache)。一级缓存是默认开启的,每个 `Session` 内部维护了一个缓存,用于存储已加载的对象,提高性能。二级缓存则可以在多个 `Session` 之间共享,...