`
leopard_lb
  • 浏览: 40504 次
  • 性别: Icon_minigender_1
  • 来自: 太原
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

利用Spring AOP 缓存方法结果集

阅读更多
我们都知道Hibernate可以用ehcache来作为Second Level Cache.主要是针对POJO的缓存,而且缓存的读取
Hibernate中是写死.实际运用中感觉很不灵活.今天看到一篇介绍利用Spring Interceptor 来缓存指定
方法结果的例子,感觉很不错,充分体会到AOP的强大力量 :)
首先配置ehcache.xml
 <ehcache>

 

字串3

    <diskStorepath="java.io.tmpdir"/>
    <cachename="org.taha.cache.METHOD_CACHE"
        maxElementsInMemory="300"
        eternal="false"
        timeToIdleSeconds="500"
        timeToLiveSeconds="500"
        overflowToDisk="true"
        />
</ehcache>
 
接下在Spring配置文件中定义Ehcache组件
 
<beanid="cacheManager"class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
 <propertyname="configLocation">
    <value>classpath:ehcache.xml</value>
 </property>
</bean>
 
<beanid="methodCache"class="org.springframework.cache.ehcache.EhCacheFactoryBean">
 <propertyname="cacheManager">
    <reflocal="cacheManager"/>
 </property>
 <propertyname="cacheName">
    <value>org.taha.cache.METHOD_CACHE</value>
 </property>
</bean>
建立我们自己的方法拦截器MethodCacheInterceptor.
MethodCacheInterceptor实现了org.aopalliance.intercept.MethodInterceptor接口.
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.springframework.beans.factory.InitializingBean;
 
/**
 *拦截器,用于缓存方法返回结果.
 *
 *@version$Id:MethodCacheInterceptor.javav1.02004-11-2814:57:00ZnjqExp$
 *@author<a href="mailto:znjq1980@etang.com">Znjq</a>
 */
publicclass MethodCacheInterceptor implements MethodInterceptor,
        InitializingBean {
    private Cache cache;
 
    /**
     *setscachenametobeused
     */
    publicvoid setCache(Cache cache) {
        this.cache = cache;
    }
 
    /*
     * (non-Javadoc)
     *
     * @see org.aopalliance.intercept.MethodInterceptor#invoke(org.aopalliance.intercept.MethodInvocation)
     */
    public Object invoke(MethodInvocation invocation) throws Throwable {
       String targetName = invocation.getThis().getClass().getName();
        String methodName = invocation.getMethod().getName();
        Object[] arguments = invocation.getArguments();
        Object result;
 
        String cacheKey = getCacheKey(targetName, methodName, arguments);
        Element element = cache.get(cacheKey);
        if (element == null) {
            //call target/sub-interceptor
            result = invocation.proceed();
 
            //cache method result
            element = new Element(cacheKey, (Serializable) result);
            cache.put(element);
        }
        return element.getValue();
    }
 
    /**
     *createscachekey:targetName.methodName.argument0.argument1...
     */
    private String getCacheKey(String targetName, String methodName,
            Object[] arguments) {
        StringBuffer sb = new StringBuffer();
        sb.append(targetName).append(".").append(methodName);
        if ((arguments != null) && (arguments.length != 0)) {
            for (int i = 0; i < arguments.length; i++) {
                sb.append(".").append(arguments[i]);
            }
        }
 
        return sb.toString();
    }
 
    /*
     * (non-Javadoc)
     *
     * @see org.springframework.beans.factory.InitializingBean#afterPropertiesSet()
     */
    publicvoid afterPropertiesSet() throws Exception {
        // TODO Auto-generated method stub
 
    }
}
invoke方法中,首先根据key查询缓存(key=className + methodName + arguments)
,缓存中存在则返回,否之调用invocation.proceed()返回结果.
Spring配置文件中定义拦截器
<beanid="methodCacheInterceptor"class="org.taha.interceptor.MethodCacheInterceptor">
 <propertyname="cache">
    <reflocal="methodCache"/>
 </property>
</bean>
 
<beanid="methodCachePointCut"class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
 <propertyname="advice">
    <reflocal="methodCacheInterceptor"/>
 </property>
 <propertyname="patterns">
    <list>
      <value>.*methodOne</value>
      <value>.*methodTwo</value>
    </list>
 </property>
</bean>
 
<beanid="myBean"class="org.springframework.aop.framework.ProxyFactoryBean">
 <propertyname="target">
   <beanclass="org.taha.beans.MyBean"/>
 </property>
 <propertyname="interceptorNames">
    <list>
      <value>methodCachePointCut</value>
    </list>
 </property>
</bean>
这里org.springframework.aop.support.RegexpMethodPointcutAdvisor是一个正规表达式切入点,
使用Perl 5的正规表达式的语法, 基Jakarta ORO。(有空写个文档,自己研究一下).
 <propertyname="target">
   <beanclass="org.taha.beans.MyBean"/>
 </property>
org.taha.beans.MyBean是我们需要做缓存处理的类.
methodCachePointCut中
<value>.*methodOne</value>
<value>.*methodTwo</value>
则是指定的模式匹配方法,对应于org.taha.beans.MyBean中的方法. 这里指定了2个方法需要做缓存处理.
呵呵,就是这么简单.这样每次对org.taha.beans.MyBean的methodOne方法进行调用,都会首先从缓存查找,
其次才会查询数据库. 这样我就不需要在xx.hbm.xml来指定讨厌的cache.也不需要在开发阶段来关心缓存.
一切AOP搞定.. ^_^
分享到:
评论

相关推荐

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

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

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

    3. **创建缓存注解**:在Spring AOP中,我们可以创建一个自定义注解来标记需要缓存的方法。例如,创建一个名为`@Cacheable`的注解: ```java @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) ...

    spring aop 自定义缓存实现

    本实例将介绍如何利用Spring AOP来实现自定义缓存功能。 首先,理解Spring AOP的基本概念。AOP是一种编程范式,它允许我们在不修改代码的情况下,为程序添加额外的功能,如日志记录、事务管理、安全检查等。在...

    Spring AOP面向方面编程原理:AOP概念

    Spring AOP主要支持方法调用作为连接点。 3. **通知(Advice)**:在特定的连接点处执行的动作,如before通知(在连接点之前执行),after通知(在连接点之后执行),around通知(环绕连接点执行)等。通知是AOP中...

    Spring源码最难问题:当Spring AOP遇上循环依赖.docx

    在AbstractBeanFactory的doGetBean方法中,可以看到Spring是如何实现三级缓存的。 首先,Spring会尝试从一级缓存中获取bean,如果不成功 maka 会尝试从二级缓存中获取,如果仍然不成功 maka 会尝试从三级缓存中获取...

    Spring AOP简单demo

    5. **缓存管理**:在方法调用前检查是否有缓存结果,避免重复计算。 6. **错误处理**:统一处理异常,提供友好的错误信息。 通过学习和实践Spring AOP,开发者可以更高效地组织代码,将关注点分离,提升代码的...

    Spring Aop使用实例

    **Spring AOP 使用实例** Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架的一个重要组成部分,它提供了一种在不修改原有代码的情况下,通过代理方式添加额外功能的技术。这种技术使得我们...

    springAop默认代理方式.zip

    8. **AOP应用场景**:Spring AOP广泛应用于日志记录、事务管理、权限控制、缓存管理等场景。通过切面可以将这些通用功能与业务逻辑解耦,提高代码的可维护性和可重用性。 总之,Spring AOP的默认代理方式是动态代理...

    使用SpringAop使用Oracle数据权限控制

    通过以上步骤,我们可以利用Spring AOP的强大功能,结合Oracle的权限体系,实现灵活且高效的数据权限控制。这种方法既保持了业务逻辑的清晰,又确保了数据的安全性。同时,由于Spring AOP的切面是解耦的,所以这种...

    第四章:Spring AOP API 设计模式1

    9. **享元模式(Flyweight)**:享元模式在Spring AOP中不太直接体现,但在Spring框架的其他部分,如缓存管理,可能会用到此模式来减少内存消耗,通过共享大量细粒度对象的内部状态来降低内存占用。 10. **代理模式...

    Spring AOP 1.0示例

    此外,Spring AOP还支持其他类型的通知,如`@After`(方法执行后)、`@AfterReturning`(正常返回后)、`@AfterThrowing`(抛出异常后)和`@Around`(环绕通知,完全控制方法的调用过程)。每种通知类型都有其特定的...

    使用spring aop对web 应用数据进行memcached缓存

    在实际应用中,`student-web`可能是一个包含学生管理功能的Web应用,使用Spring AOP和Memcached可以高效地缓存学生的查询结果,提高响应速度,减轻数据库压力。通过不断优化和调整缓存策略,可以进一步提升系统性能...

    spring AOP实现查询缓存

    本代码通过使用spring aop+ehcache的技术,实现了方法级别的查询缓存,主要原理是 方法的完整路径+方法参数值,作为key,放入cache中,下次访问时先判断cache中是否有该key.

    spring Aop文档

    5. **缓存管理**:根据业务需求自动缓存方法结果,提高系统响应速度。 #### 七、总结 Spring AOP通过提供灵活且强大的机制来帮助开发者管理横切关注点,极大地提高了开发效率和代码可维护性。无论是对于初学者还是...

    SpringAOP之探秘(动态代理、责任链模式、注解使用)

    你可能会看到如何通过Spring AOP自定义代理类,以及如何利用JDK动态代理和CGLIB来拦截并增强方法的执行。 3. **第六章_cache-demo.zip**:此示例可能进一步扩展了缓存相关的实现,包括不同类型的缓存策略、缓存更新...

    spring aop4.3.10

    8. **AOP应用场景**:Spring AOP广泛应用于事务管理、安全控制、缓存管理、日志记录等多个领域。例如,`@Transactional`注解可以方便地声明一个方法需要在数据库事务中执行。 9. **与其他Spring模块的集成**:...

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

    综上所述,通过 Spring AOP 和 EhCache 的结合,我们可以创建一个高效的缓存系统,它能够在 Service 和 DAO 层自动缓存查询结果,并在数据更新时自动刷新缓存。这种设计不仅可以提高系统的响应速度,还可以减轻...

    Spring aop

    **Spring AOP 概述** Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架中的一个重要组成部分,它为应用程序提供了声明式的企业级服务,如事务管理、日志记录、性能监控等。AOP的主要目的是...

Global site tag (gtag.js) - Google Analytics