`
mengqingyu
  • 浏览: 332997 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

AOP+Ehcache 缓存框架

阅读更多
AOP+Ehcache 实现缓存功能

设计思路:查询数据,通过AOP拦截需要缓存的方法,在方法进入之前进入拦截器,通过包、类、方法名称作为key获取当前缓存对象结果,如果为空,则执行真正的方法,如果有缓存对象,则直接返回。删除和修改数据,每次都在此之前调用拦截器方法清除相关缓存对象。

1.需要引入AOP和Ehcache相关Jar文件

2.编写切面类里面写上拦截时的业务逻辑

import java.io.Serializable;
import java.util.List;

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;

/**
 * 
 * 类功能描述:AOP+Ehcache 拦截需要缓存的方法,插入点方法执行前后
 *
 * @author <a href="mailto:qingyu.meng21@gmail.com">mengqingyu </a>
 * @version $Id: codetemplates.xml,v 1.1 2009/03/06 01:13:01 mengqingyu Exp  $
 * Create:  2011-12-12 下午04:27:44
 */
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(); 
    } 

    /**
     * 拦截Service/DAO的方法,并查找该结果是否存在,如果存在就返回cache中的值, 
     * 否则,返回数据库查询结果,并将查询结果放入cache  
     */
    @Override
    public Object invoke(MethodInvocation invocation) throws Throwable { 
        Object result; 
        String cacheKey = getCacheKey(invocation.getThis().getClass().getName()
        		, invocation.getMethod().getName(), invocation.getArguments()); 
        Element element = cache.get(cacheKey); 
        logger.warn("检查缓存:" + cacheKey); 
        if (element == null) { 
            logger.warn("创建缓存......");
            result = invocation.proceed(); 
            element = new Element(cacheKey, (Serializable) result); 
            cache.put(element); 
        } 
        List list = cache.getKeys();
        return element.getValue(); 
    } 

    /**
     * 
     * @function:获得cache key的方法,cache key是Cache中一个Element的唯一标识 
     * 			 cache key包括 包名+类名+方法名,如com.co.cache.service.UserServiceImpl.getAllUser 
     * @param targetName
     * @param methodName
     * @param arguments
     * @return
     * @author: mengqingyu    2011-12-12 下午04:35:21
     */
    private String getCacheKey(String targetName, String methodName, Object[] arguments) {
    	StringBuilder sb = new StringBuilder(); 
        sb.append(targetName).append(".").append(methodName); 
        if (arguments != null) { 
            for(Object o:arguments){
            	sb.append(".").append(o); 
            }
        } 
        return sb.toString(); 
    } 
     
    /**
     * implement InitializingBean,检查cache是否为空 
     */
    public void afterPropertiesSet() throws Exception { 
        Assert.notNull(cache, "缓存未初始化");
     }
}

package com.berheley.bi.aop;

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;

/**
 * 
 * 类功能描述:AOP+Ehcache 拦截需要缓存的方法,插入点方法执行之后
 *
 * @author <a href="mailto:qingyu.meng21@gmail.com">mengqingyu </a>
 * @version $Id: codetemplates.xml,v 1.1 2009/03/06 01:13:01 mengqingyu Exp  $
 * Create:  2011-12-12 下午04:27:44
 */
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(); 
    } 

    /**
     * 拦截Service/DAO的方法,并查找该结果是否存在,如果存在则删除结果, 
     * 否则忽略,此方法为了保证更新数据库同时同步缓存  
     */    
	@Override
	public void afterReturning(Object arg, Method method, Object[] arguments,
			Object obj) throws Throwable {
		String className = obj.getClass().getName();
		List<String> list = cache.getKeys();
		for(String cacheKey:list){
			if(cacheKey.startsWith(className)){
				cache.remove(cacheKey);
				logger.debug("删除缓存:" + cacheKey);
			}
		}
	} 
	
    /**
     * implement InitializingBean,检查cache是否为空 
     */
    public void afterPropertiesSet() throws Exception { 
        Assert.notNull(cache, "缓存未初始化");
     }
}


3.配置文件中配置AOP和类的实例化

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xsi:schemaLocation="
		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
		http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd
		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
		http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd ">
	
	<!-- AOP+Ehcache by mengqingyu-->
	
	<!-- 引用ehCache的配置 -->
	<bean id="defaultCacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
	  <property name="configLocation">
		<value>classpath:ehcache.xml</value>
	  </property>
	</bean>
	
	<!-- 定义ehCache的工厂,并设置所使用的Cache name 如找不到则使用默认缓存配置defaultCache-->
	<bean id="ehCache" class="org.springframework.cache.ehcache.EhCacheFactoryBean">
	  <property name="cacheManager">
		<ref local="defaultCacheManager"/>
	  </property>
	  <property name="cacheName">
		  <value>systemCache</value>
	  </property>
	</bean>
	
	<!-- find/create cache拦截器 -->
	<bean id="methodCacheInterceptor" class="com.berheley.bi.aop.MethodCacheInterceptor">
	  <property name="cache">
		<ref local="ehCache" />
	  </property>
	</bean>
	
	<!-- find/create cache拦截器 -->
	<bean id="methodCacheAfterAdvice" class="com.berheley.bi.aop.MethodCacheAfterAdvice">
	  <property name="cache">
		<ref local="ehCache" />
	  </property>
	</bean>
	
	<!-- 自动代理 -->
	<aop:config>
		<!-- 这里可添加多个切入点 -->
		<aop:advisor pointcut="execution(* com.berheley.bi.report.service.impl.SummaryReportServiceImpl.getSource*(..))"   advice-ref="methodCacheInterceptor" />
		<aop:advisor pointcut="execution(* com.berheley.bi.report.service.impl.SummaryReportServiceImpl.getPrefixAndSuffix*(..))"   advice-ref="methodCacheAfterAdvice" />
	</aop:config>
</beans>


4.引入ehcache.xml文件

<!-- AOP+Ehcache by mengqingyu-->

<!-- 
	diskStore 当内存缓存数量超过设置数量时,将数据写到硬盘中,path为硬盘相对路径 
	maxElementsInMemory 缓存中最大允许创建的对象数
	eternal 缓存中对象是否为永久,如果true过期设置将无效 
	timeToIdleSeconds 自最后读取开始有效时间 
	timeToLiveSeconds 自创建开始有效时间
	overflowToDisk 内存不足时是否启用磁盘缓存 
-->
<ehcache>
	<diskStore path="java.io.tmpdir"/> 
	
	<defaultCache 
		maxElementsInMemory="10000" 
		eternal="false" 
		overflowToDisk="true" 
		timeToIdleSeconds="120" 
		timeToLiveSeconds="120" 
		diskPersistent="false" 
		diskExpiryThreadIntervalSeconds="120"/>
		
  	<cache name="systemCache"
        maxElementsInMemory="10000"  
        eternal="false" 		
        timeToIdleSeconds="259200000" 
        timeToLiveSeconds="259200000"  
        overflowToDisk="true"/>    

</ehcache>

分享到:
评论

相关推荐

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

    在本篇【Spring AOP+ehCache简单缓存系统解决方案】中,我们将探讨如何利用Spring AOP(面向切面编程)和ehCache框架来构建一个高效、简单的缓存系统,以提升应用程序的性能。ehCache是一款流行的开源Java缓存库,它...

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

    首先,EhCache 是一个广泛使用的开源 Java 缓存框架,它可以存储对象并提供高速访问。Spring 对 EhCache 的集成使得在 Spring 应用程序中使用缓存变得非常方便。通过 Spring 的配置,EhCache 可以被配置为自动管理...

    spring + ehcache + redis两级缓存

    当我们谈论“Spring + Ehcache + Redis”两级缓存时,我们实际上是在讨论如何在Java环境中利用Spring框架来集成Ehcache作为本地缓存,并利用Redis作为分布式二级缓存,构建一个高效且可扩展的缓存解决方案。...

    Spring+Acegi+ehcache安全框架常用jar包.rar

    Ehcache则是一个广泛使用的内存缓存系统,它可以帮助提高应用性能,通过缓存数据来减少数据库的读取操作。 Spring Security前身Acegi Security是Spring框架的一个扩展,它提供了一套全面的权限管理和认证机制,包括...

    Spring+Struts+页面缓存+内存数据库+licence+proxool+EhCache 搭建的系统基础平台

    首先,Spring框架是Java应用的核心,它提供了依赖注入(DI)和面向切面编程(AOP),使得对象之间的关系更加灵活,降低了代码的耦合度。Spring还提供了丰富的模块,如数据访问/集成、Web MVC、事务管理等,为开发者...

    spring boot 使用jsp 集成hibernate+shiro+ehcache项目分享

    - 在需要缓存的方法上添加 @Cacheable 注解,让 Spring AOP 自动处理缓存逻辑。 - 可以通过 @CacheEvict 清除特定缓存,@CachePut 更新缓存。 **4. 项目结构与 dadminboot** 在 `dadminboot` 这个项目的目录结构中...

    spring+ehcache示例整合Demo

    在这个"spring+ehcache示例整合Demo"中,我们将会探讨如何将Ehcache集成到Spring框架中,以实现高效的缓存管理。 首先,我们需要在项目的`pom.xml`文件中引入Ehcache和Spring的依赖。Ehcache通常使用的是`org....

    spring+ibatis+ehcache整合例子

    在IT行业中,Spring、iBatis和Ehcache是三个非常重要的开源框架,它们分别用于企业级应用的依赖注入、数据库操作和缓存管理。这个"spring+ibatis+ehcache整合例子"是一个完整的示例项目,展示了如何将这三个框架无缝...

    Spring中AOP实现EHCache的整合(一)

    在本文中,我们将深入探讨如何在Spring框架中集成并使用AOP(面向切面编程)来实现对EHCache的高效管理。Spring是一个广泛使用的Java应用框架,它提供了强大的依赖注入和面向切面编程功能。而EHCache是一款流行、高...

    SpringAOP结合ehCache实现简单缓存实例

    在IT行业中,Spring AOP(面向切面编程)和EhCache是两个非常重要的概念,它们在提升应用程序性能和管理缓存方面发挥着关键作用。本文将深入探讨如何结合Spring AOP与EhCache实现一个简单的缓存实例,以便优化Java...

    maven+spring+ehcache

    这个实例演示了如何利用Maven作为构建工具,Spring作为核心框架,Ehcache作为缓存解决方案,以及Spring JDBC处理数据库交互。 **Maven** 是一个项目管理和综合工具,它管理项目的构建、依赖关系和生命周期。在本...

    Spring 与Ehcache实现基于方法的缓存

    本篇文章将详细探讨如何在Spring框架中集成并实现基于方法的缓存机制,利用Ehcache来优化数据访问。 首先,我们需要理解Spring的AOP概念,AOP允许我们定义横切关注点,如日志、事务管理或,正如在这个案例中,缓存...

    ssm多模块基础框架+dubbo+ehcache

    【标题】"ssm多模块基础框架+dubbo+ehcache" 涉及到的核心技术栈包括Spring、SpringMVC、MyBatis(SSM)框架的整合,Dubbo服务治理框架,以及Ehcache缓存系统。这些技术在企业级Java应用开发中扮演着重要角色,下面...

    hibernate4+spring4+springmvc+ehcache+自己写的cache系统

    Ehcache支持分布式缓存,可以处理大量并发请求,并且与Hibernate有良好的集成,可以在查询结果缓存方面发挥重要作用。 4. 自己写的Cache系统:在一些特定场景下,开发者可能需要定制化的缓存解决方案,以满足特定...

    Spring+Hibernate+ehcache整合

    Spring是一个全面的后端应用框架,提供依赖注入、AOP(面向切面编程)、MVC(模型-视图-控制器)等特性;Hibernate是一个优秀的ORM(对象关系映射)框架,用于简化数据库操作;而Ehcache则是一个高效的缓存解决方案...

    ssh,struts+hibernate+spring+ehcache集成

    Spring框架是Java企业级应用的核心框架,它提供了一个全面的基础设施,包括DI(依赖注入)、AOP(面向切面编程)、数据访问、Web应用、事务管理等。Spring的IoC容器是其核心,可以管理对象的生命周期和依赖关系。在...

    spring mvc + mybatis + ehcache

    Spring框架对Ehcache有很好的支持,可以通过`&lt;ehcache:config&gt;`标签进行配置,并通过`@Cacheable`等注解实现方法级别的缓存控制。 集成这三个框架,首先要在Spring的配置文件中定义DataSource、SqlSessionFactory和...

    SpringMvc+MyBatis+ehcache+ExtJs分页

    3. 引入Ehcache:添加Ehcache依赖,配置缓存管理器,指定缓存策略,并在需要的地方使用缓存注解。 4. 在Spring中管理MyBatis和Ehcache:使用Spring的声明式事务管理,同时将MyBatis的SqlSessionTemplate和Ehcache的...

Global site tag (gtag.js) - Google Analytics