`

利用Spring AOP 缓存方法结果集(上)

阅读更多

我们都知道Hibernate可以用ehcache来作为Second Level Cache.主要是针对POJO的缓存,而且缓存的读取

Hibernate中是写死.实际运用中感觉很不灵活.今天看到一篇介绍利用Spring Interceptor 来缓存指定

方法结果的例子,感觉很不错,充分体会到AOP的强大力量 :)

首先配置ehcache.xml

 <ehcache>

 


    <diskStore path="java.io.tmpdir"/>

<defaultCache name="default"

        maxElementsInMemory="300"

        eternal="false"

        timeToIdleSeconds="500"

        timeToLiveSeconds="500"

        overflowToDisk="true"
       
        diskPersistent="false"
       
        diskExpiryThreadIntervalSeconds="110"

        />


    <cache name="org.taha.cache.METHOD_CACHE"

        maxElementsInMemory="300"

        eternal="false"

        timeToIdleSeconds="500"

        timeToLiveSeconds="500"

        overflowToDisk="true"

        />

</ehcache>

 

接下在Spring配置文件中定义Ehcache组件

 

<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">

  <property name="configLocation">

    <value>classpath:ehcache.xml</value>

  </property>

</bean>

 

<bean id="methodCache" class="org.springframework.cache.ehcache.EhCacheFactoryBean">

  <property name="cacheManager">

    <ref local="cacheManager"/>

  </property>

  <property name="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.java v 1.0 2004-11-28 14:57:00 Znjq Exp $

 * @author <a href="mailto:znjq1980@etang.com">Znjq </a>

 */

public class MethodCacheInterceptor implements MethodInterceptor,

        InitializingBean {

    private Cache cache;

 

    /**

     * sets cache name to be used

     */

    public void 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();

    }

 

    /**

     * creates cache key: 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()

     */

    public void afterPropertiesSet() throws Exception {

        // TODO Auto-generated method stub

 

    }

}

分享到:
评论

相关推荐

    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源码最难问题:当Spring AOP遇上循环依赖.docx

    Spring源码最难问题:当Spring AOP遇上循环依赖 Spring源码中最难的问题之一是循环依赖问题,当Spring AOP遇上循环依赖时,该如何解决? Spring通过三级缓存机制解决循环依赖的问题。 在Spring中,bean的实例化...

    spring aop 自定义缓存实现

    `@Cacheable`注解可以添加到我们希望缓存结果的方法上,这样每次调用该方法时,都会首先检查缓存,如果存在则返回缓存的结果,否则执行方法并存储结果。 这个实例中的压缩包可能包含了配置文件、源代码和测试案例,...

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

    Spring AOP是在Spring框架的基础上实现的一种面向方面编程机制。 1. **方面(Aspect)**:这是AOP的核心概念之一,指代一个关注点的模块化,该关注点可能会横切多个对象。例如事务管理就是一个典型的横切关注点,...

    Spring AOP简单demo

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

    Spring Aop使用实例

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

    springAop默认代理方式.zip

    6. **切面和通知**:在Spring AOP中,切面(Aspect)是包含多个通知(Advice)的模块化结构,通知定义了在特定连接点(Join Point)上执行的行为,比如方法调用前后。切面可以定义自己的通知类型,包括前置通知...

    Spring AOP 1.0示例

    Spring AOP 1.0是Spring框架早期的一个版本,它引入了面向切面编程(Aspect Oriented Programming,AOP)的概念,使得开发者可以方便地实现横切关注点,如日志记录、事务管理、性能监控等,从而提高代码的可读性和可...

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

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

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

    标题 "使用Spring AOP对Web应用数据进行Memcached缓存" 涉及到的关键技术是Spring AOP(面向切面编程)和Memcached,这是一种常见的高性能、分布式内存对象缓存系统。在Web应用程序中,使用缓存可以显著提高数据访问...

    spring AOP实现查询缓存

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

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

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

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

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

    spring Aop文档

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

    spring aop4.3.10

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

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

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

    Spring aop

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

Global site tag (gtag.js) - Google Analytics