了解了一下spring +ehcache 这里对其实现做以简单介绍,仅仅个人理解,若有所误,请多指点。
ehcache 大家都很熟悉,我这里主要通过总结记录下spring和ehcache结合的步骤,并对一些细节做详细的阐述。
首先我们需要配置ehcache的配置文件包含了缓存路径,大小,过期时间等 注意里面的defaultcache不要删除否则会出错滴。然后我们在把ehcache的jar包导入。
其次 我们需要写了两个类 这两个类一个用来对查询的缓存和再查询的缓存调用(代码1),一个用来处理如果对某一资源做了改动或者新增,则清除这中资源的所有缓存(代码2)。 接下来我们在spring配置文件中配置ehcache(你也可以单独文件中写),包括ehcache的引用,工厂,再将自己写的两个拦截器配置好之后在配置两个符合代理使用的两个bean,分别将两个拦截器注入。
最后我们为自己写的service/dao 在spring配置,再为他们分别配置代理,代理所要拦截的东西就是前面的两个拦截器。
接下来我将配置的具体内容贴出来
代码1 写道
package com.my.cache.ehcache;
import java.io.Serializable;
import net.sf.ehcache.Cache;
import net.sf.ehcache.Element;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.util.Assert;
/**
* ehCache 查询缓存处理
* @author lyon.yao
*
*/
public class MethodCacheInterceptor implements MethodInterceptor,
InitializingBean {
private static final Log logger = LogFactory.getLog(MethodCacheInterceptor.class);
private Cache cache;
public void setCache(Cache cache) {
this.cache = cache;
}
public MethodCacheInterceptor() {
super();
}
/* (non-Javadoc)
* 检测cache对象是否为空
* @see org.springframework.beans.factory.InitializingBean#afterPropertiesSet()
*/
@Override
public void afterPropertiesSet() throws Exception {
Assert.notNull(cache, "cache is null,please set a new cache");
}
/* (non-Javadoc)
* 过滤service/dao 方法如果缓存中存在直接返回 否则从数据库中查找结果返回并放入缓存
* @see org.aopalliance.intercept.MethodInterceptor#invoke(org.aopalliance.intercept.MethodInvocation)
*/
@Override
public Object invoke(MethodInvocation invocation) throws Throwable {
Object result=null;
String targetName = invocation.getThis().getClass().getName();
String methodName = invocation.getMethod().getName();
Object[] arguments = invocation.getArguments();
String cacheKey = getCacheKey(targetName, methodName, arguments);
Element element = cache.get(cacheKey);
if (element == null) {
logger.debug("Hold up method , Get method result and create cache........!");
result = invocation.proceed();
element = new Element(cacheKey, (Serializable) result);
cache.put(element);
}
return element.getValue();
}
/**
* 获得 cache key 的方法,cache key 是 Cache 中一个 Element 的唯一标识
* cache key 包括 包名+类名+方法名,如 com.co.cache.service.UserServiceImpl.getAllUser
* @param targetName
* @param methodName
* @param arguments
* @return
*/
private String getCacheKey(String targetName,String methodName,Object[] arguments) {
StringBuffer key = new StringBuffer();
key.append(targetName).append(".").append(methodName);
if ((arguments != null) && (arguments.length != 0)) {
for (int i = 0; i < arguments.length; i++) {
key.append(".").append(arguments[i]);
}
}
return key.toString();
}
}
代码2 写道
package com.my.cache.ehcache;
import java.lang.reflect.Method;
import java.util.List;
import net.sf.ehcache.Cache;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.aop.AfterReturningAdvice;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.util.Assert;
/**
* 功能:进行插入、修改、删除对cache的清理
* @author lyon.yao
*
*/
public class MethodCacheAfterAdvice implements AfterReturningAdvice,
InitializingBean {
private static final Log logger = LogFactory.getLog(MethodCacheAfterAdvice.class);
private Cache cache;
public void setCache(Cache cache) {
this.cache = cache;
}
public MethodCacheAfterAdvice() {
super();
}
/* (non-Javadoc)
* 检测cache对象是否为空
* @see org.springframework.beans.factory.InitializingBean#afterPropertiesSet()
*/
@Override
public void afterPropertiesSet() throws Exception {
Assert.notNull(cache, "cache is null,please set a new cache");
}
/* (non-Javadoc)
* 刷新cache
* @see org.springframework.aop.AfterReturningAdvice#afterReturning(java.lang.Object, java.lang.reflect.Method, java.lang.Object[], java.lang.Object)
*/
@Override
public void afterReturning(Object arg0, Method arg1, Object[] arg2,
Object arg3) throws Throwable {
String className = arg3.getClass().getName();
List list = cache.getKeys();
for(int i = 0;i<list.size();i++){
String cacheKey = String.valueOf(list.get(i));
if(cacheKey.startsWith(className)){
cache.remove(cacheKey);
}
logger.debug("remove cache " + cacheKey);
}
}
}
ehcache.xml 写道
<?xml version="1.0" encoding="UTF-8"?>
<ehcache>
<diskStore path="java.io.tmpdir"/>
<defaultCache
maxElementsInMemory="500"
eternal="false"
timeToIdleSeconds="300"
timeToLiveSeconds="1200"
overflowToDisk="true" />
<cache name="DEFAULT_CACHE"
maxElementsInMemory="5000"
eternal="false"
timeToIdleSeconds="500"
timeToLiveSeconds="500"
overflowToDisk="true"
/>
</ehcache>
写道
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<!-- 缓存管理 -->
<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean" >
<property name="configLocation">
<value>classpath:ehcache.xml</value>
</property>
</bean>
<!-- 信息缓存 -->
<bean id="ehCache" class="org.springframework.cache.ehcache.EhCacheFactoryBean">
<property name="cacheName">
<value>DEFAULT_CACHE</value>
</property>
<property name="cacheManager" ref="cacheManager" />
</bean>
<!-- find/create cache 拦截器 -->
<bean id="methodCacheInterceptor"
class="com.my.cache.ehcache.MethodCacheInterceptor">
<property name="cache">
<ref local="ehCache" />
</property>
</bean>
<!-- flush cache 拦截器 -->
<bean id="methodCacheAfterAdvice"
class="com.my.cache.ehcache.MethodCacheAfterAdvice">
<property name="cache">
<ref local="ehCache" />
</property>
</bean>
<bean id="methodCachePointCut"
class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
<property name="advice">
<ref local="methodCacheInterceptor"/>
</property>
<property name="patterns">
<list>
<value>.*find.*</value>
<value>.*get.*</value>
<value>.*list.*</value>
<value>.*query.*</value>
</list>
</property>
</bean>
<bean id="methodCachePointCutAdvice"
class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
<property name="advice">
<ref local="methodCacheAfterAdvice"/>
</property>
<property name="patterns">
<list>
<value>.*add.*</value>
<value>.*create.*</value>
<value>.*update.*</value>
<value>.*delete.*</value>
<value>.*remove.*</value>
</list>
</property>
</bean>
</beans>
applicationContext-sevice.xml 写道
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<import resource="cacheContext.xml"/>
<bean id="testServiceTarget" class="com.co.cache.test.TestServiceImpl"/>
<bean id="testService" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="target">
<ref local="testServiceTarget"/>
</property>
<property name="interceptorNames">
<list>
<value>methodCachePointCut</value>
<value>methodCachePointCutAdvice</value>
</list>
</property>
</bean>
</beans>
分享到:
相关推荐
Spring、Hibernate和Ehcache是Java开发中常用的三个框架,它们在企业级应用开发中扮演着重要的角色。Spring是一个全面的后端应用框架,提供依赖注入、AOP(面向切面编程)、MVC(模型-视图-控制器)等特性;...
本篇文章将详细讲解基于Spring、SpringMVC、MyBatis、SpringSecurity、EhCache和JCaptcha这六大组件构建的Web框架。 1. **Spring**: Spring作为整个框架的核心,提供了依赖注入(DI)和面向切面编程(AOP)等特性...
《Java EE企业级应用开发教程Spring+Spring MVC+MyBatis》是一本深入探讨Java企业级应用程序...通过学习和实践这些源代码,开发者可以深入理解Spring、Spring MVC和MyBatis的工作原理,并能熟练地在实际项目中应用。
Hibernate还提供了缓存机制,包括一级缓存(SessionFactory级别的缓存,每个Session操作的对象会缓存在此)和二级缓存(可选,用于跨Session共享数据,可以使用第三方缓存实现如EhCache)。 【Hibernate优化策略】 ...
- 然后,配置Spring的ApplicationContext.xml文件,声明Bean和AOP配置,以及Ehcache的配置。 - 接着,配置Struts的struts.xml文件,定义Action和结果映射。 - 对于Hibernate,需要配置hibernate.cfg.xml文件,设置...
Ehcache 的引入是为了实现二级缓存,提高数据读取速度。它可以在内存中存储常用数据,减少对数据库的访问。Hibernate 可以与 Ehcache 集成,将频繁查询的结果缓存起来,当相同的查询再次发生时,直接从缓存中获取,...
### Spring 整合 EhCache 实现原理与应用详解 #### 一、Spring 对 Cache 的支持 从 Spring 3.1 版本开始,Spring 框架正式引入了对 Cache 的支持,这种支持的方式和原理与 Spring 对事务管理的支持非常类似。通过...
- **Spring MVC**:与Struts类似,提供了另一种MVC实现,可以与Struts结合使用。 - **事务管理**:通过声明式或编程式事务管理,确保业务操作的原子性。 3. **Hibernate框架**: - **ORM(对象关系映射)**:将...
9. **性能优化**:结合缓存技术(如Redis或 Ehcache)、数据库连接池(如HikariCP或Druid)、以及负载均衡和分布式部署策略,可以进一步优化基于SpringMVC、Spring和Mybatis的应用性能。 通过以上讲解,我们可以...
在本项目中,"spring+springmvc项目"是一个基于Java技术栈的Web应用程序,它采用了一系列先进的...在实际开发中,还需要深入理解每个框架的原理和用法,以及如何将它们有效地整合在一起,以实现最佳的系统设计和性能。
Ehcache的基本原理是通过将常用但计算成本较高的数据存储在内存中,减少对数据库或计算资源的访问,从而实现高速的数据读取。它采用键值对的形式,用户可以通过键来快速获取对应的值。Ehcache支持两种主要的缓存模式...
本代码通过使用spring aop+ehcache的技术,实现了方法级别的查询缓存,主要原理是 方法的完整路径+方法参数值,作为key,放入cache中,下次访问时先判断cache中是否有该key.
- **第三方缓存**:如 EhCache、OSCache 等。 #### 六、Hibernate 查询方式 **6.1 SQL 查询** 直接编写 SQL 语句进行查询。 **6.2 HQL 查询** - **属性查询**:针对实体类的属性进行查询。 - **参数查询**:使用...
9. **第10章**:最后,可能会讨论一些高级主题,比如Spring的缓存支持(如使用Ehcache或Redis),以及Mybatis的延迟加载和缓存机制。此外,还可能涉及性能优化策略,如批处理操作和连接池的配置。 以上各章节的源码...
### Struts + Spring + Hibernate 资料 #### 1. Hibernate 的并发机制与处理并发问题的方法 **并发机制概述**: - **Session 对象的线程安全性**:Hibernate 的 Session 对象并不是线程安全的,这意味着对于每一...
### Ehcache分布式缓存及其在Spring中的应用 #### 一、Ehcache概述与原理 Ehcache是一款高效且轻量级的纯Java缓存框架,由于其出色的性能和易于集成的特点,在Java开发中有着广泛的应用。作为Hibernate的默认缓存...
首先,我们需要理解 Spring HttpInvoke 的基本工作原理。HttpInvoke 将服务端的方法调用转化为 HTTP 请求,客户端通过发送 HTTP 请求到服务端,服务端接收到请求后执行相应的业务逻辑,再将结果返回给客户端。这个...
本文将详细探讨如何在Spring集成的Hibernate环境中配置二级缓存,以及其背后的原理和实践。 首先,我们需要了解什么是二级缓存。在Hibernate中,一级缓存是每个Session内部的缓存,它自动管理实体的状态,当一个...
在Java后台开发中,Spring、Spring MVC、Hibernate和Ehcache是四个非常关键的框架,它们各自承担着不同的职责并协同工作,构建出高效、稳定且可扩展的应用系统。 Spring框架是Java企业级应用的核心框架,它提供了一...