`
san586
  • 浏览: 134740 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

ss3ex中使用声明式缓存

阅读更多
spring Modules ehcache 存在缺陷,老是配置不成功,通过@Aspect结合annotation来实现了声明式缓存。
1、在spring的xml配置文件中配置aspectj 如下:
<?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:aop="http://www.springframework.org/schema/aop"   
     xsi:schemaLocation="    
         http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd    
         http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">    
    <aop:aspectj-autoproxy />
</beans>

2、创建注释的定义如下:
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target( { ElementType.METHOD })
@Documented
public @interface Ehcache {
	// 缓存名称,默认为空
	String cacheName() default "";

	// 增加缓存还是删除缓存,默认为增加缓存
	boolean addOrdel() default true;
}

3、添加ehcache的配置文件
<cache name="testCache" maxElementsInMemory="500"
		overflowToDisk="true" eternal="true">
		<cacheEventListenerFactory
			class="net.sf.ehcache.distribution.RMICacheReplicatorFactory"
			properties="replicatePuts=false,replicateUpdatesViaCopy=false" />
	</cache>

4、写切面类
import java.io.Serializable;
import java.lang.reflect.Method;

import net.sf.ehcache.Cache;
import net.sf.ehcache.CacheManager;
import net.sf.ehcache.Element;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;

@Component
@Aspect
public class EhcacheAspect {
	private static Cache cache;
	static {
		if (cache == null) {
			cache = CacheManager.getInstance().getCache("testCache");
		}
	}

	@Pointcut("@annotation(Ehcache)")
	public void simplePointcut() {
	}

	@AfterReturning(pointcut = "simplePointcut()")
	public void simpleAdvice() {
		System.out.println("AOP后处理成功");
	}

	/*
	 * 试图得到标注方法的Ehcache类 根据Ehcache的属性进行逻辑处理
	 */
	@Around("simplePointcut()")
	public Object aroundLogCalls(ProceedingJoinPoint joinPoint)
			throws Throwable {
		// 获取连接点的方法签名对象
		MethodSignature joinPointObject = (MethodSignature) joinPoint
				.getSignature();
		// 连接点对象的方法
		Method method = joinPointObject.getMethod();
		// 连接点方法方法名
		String name = method.getName();
		Class<?>[] parameterTypes = method.getParameterTypes();
		// 获取连接点所在的目标对象
		Object target = joinPoint.getTarget();
		// 获取目标方法
		method = target.getClass().getMethod(name, parameterTypes);
		// 返回@AroundPointCut的注释对象
		Ehcache ehcache = method.getAnnotation(Ehcache.class);
		String targetName = joinPoint.getTarget().getClass().toString();
		String methodName = joinPoint.getSignature().getName();
		Object[] arguments = joinPoint.getArgs();
		Object result;
		if ((arguments != null) && (arguments.length != 0)) {
			result = joinPoint.proceed(arguments);
		} else {
			result = joinPoint.proceed();
		}
		if (ehcache.addOrdel()) {
			// 增加缓存
			String cacheKey = getCacheKey(targetName, methodName, arguments);
			Element element = cache.get(cacheKey);
			if (element == null) {
				element = new Element(cacheKey, (Serializable) result);
				cache.put(element);
			}
			return element.getValue();
		} else {
			// 清空缓存
			cache.removeAll();
			return result;
		}

	}

	/**
	 * 获得cache key的方法,cache key是Cache中一个Element的唯一标识 cache key包括
	 * 包名+类名+方法名,如com.co.cache.service.UserServiceImpl.getAllUser
	 */
	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();
	}
}

5、在所有想要缓存的方法上加注标签就能实现缓存了。
//增加缓存
@Ehcache
//删除缓存
@Ehcache(addOrdel=false)
分享到:
评论
1 楼 flyingcai 2009-05-22  
spring Modules ehcache 存在缺陷,老是配置不成功???

我的测试是可以的。包括一二级缓存,都是可用的。

相关推荐

    ss3ex中使用UrlRewrite

    下面将详细介绍SS3EX中使用UrlRewrite的相关知识点。 首先,URL重写主要是通过配置文件(如本例中的`urlrewrite.xml`)来实现的。这个配置文件定义了一系列规则,用于将原始URL转换为重写后的URL。在SS3EX框架中,`...

    发布ss3ex的maven版本,取名叫sango吧

    总结来说,这个项目是关于将ss3ex转换成一个支持Maven的Java项目,便于管理和构建,同时也可能提供了一种工具,帮助开发者在他们的工作中更高效地使用或集成ss3ex。通过博客链接提供的信息,读者可以深入了解这个...

    SSD3ex2答案

    2007卡耐基软件工程网路教材 SSD3ex2答案

    ssd3ex5练习5

    ssd3ex5源码,自己写的,保证100分!

    springside3+ext源代码

    文件列表中的"ss3ex.bmp"可能是一个项目标识或图标,它可能包含了项目的视觉元素,帮助识别项目。而"ss3ex"可能是项目的主干代码或者扩展模块,包含了对SpringSide3核心功能的增强和定制。 这个项目的源代码分析,...

    SSD3 EX1-7

    在标签中,“SSD3”可能是课程的代号,而“JAVA”则指明了编程语言,这意味着我们将探讨如何使用Java来处理与SSD相关的任务。Java是一种广泛使用的、跨平台的编程语言,非常适合开发系统级软件,包括SSD控制器或管理...

    maven版ibatis

    博客链接(https://ss3ex.iteye.com/blog/436901)可能包含了关于如何在Maven项目中集成和配置iBatis的实践教程,读者可以通过阅读该博客获取更具体的步骤和示例代码。 综上所述,"maven版ibatis"的主题涵盖了Maven...

    派特莱LCE-A 多层信号灯2D CAD Pole M2.pdf

    派特莱LCE-A 多层信号灯2D CAD Pole M2pdf,特点:高节能无需维护的LED多层信号灯,体积小可识别性强,特别匹配于各类中小型设备的外观设计。派特莱特有的混合棱镜切割灯罩,消除了可能存在的视觉盲点,大大提高了远...

    Sizzle v4.0.0.59

    Sizzle 是一套前端用智能来处理模块和组件依赖关系的框架。 它遵循 CommonJS 的运行规范来完成对各个模块的动态加载。...Sizzle 框架将被使用在 PJBlog4 新版本中,让后台更加代码逻辑化和模块化。

    AIT存储助力盲人护助中心数据保护成功应用案例

    它以其高容量、高速度、低成本和可靠性获得了广泛应用,尤其是在非营利组织中,如科罗拉多盲人护助中心。 1. **高容量与高速度**: AIT-3Ex是Sony AIT系列的升级版本,提供了显著的存储性能提升。在未压缩状态下,...

    matlab开发-用matlab解题

    例如,`ch3ex6.m`, `ch3ex5.m`, `ch2ex3.m`, `ch4ex5a.m` 和 `ch2ex4.m` 可能是书中的练习题,每个对应一个特定章节的实例,可能涵盖了不同主题的MATLAB编程实践。 3. **图像处理**: 标签"图像处理与计算机视觉...

    C++实现显示MP3文件信息的方法

    此外,注意到在代码中还有回调函数`CallbackFunc`的声明,但并没有给出具体的实现。在实际应用中,这个回调函数可以用来处理播放过程中的事件,如播放状态改变、错误发生等。然而,这个示例仅关注于读取和显示元数据...

    练习二(龙版)答案.doc

    3. **期望(数学期望)**(Expectation):随机变量的期望表示其平均值,如第4题中的EX=,第9题中的EX=np=1.6,第13题中的E(z)=3EX-2。 4. **方差(Variance)**:随机变量的方差衡量其数值离散程度,如第4题中的DX...

    新健太郎通信协议(中文) - 副本1

    2. **适用**:此协议适用于所有使用HBP-9021/9020的通信场景,无论是在设备的开发阶段还是实际操作过程中。 3. **连接构成**:在PC与主CPU进行通信时,它们通过RS232C串行通信端口相连,具体是通过UART接口的TxD...

    手机wap源码模板 (783).zip

    这个压缩包中的文件主要服务于创建一个功能完备、响应式的手机网站。 1. **index.html**:这是网站的主页模板。通常包含网站的导航、头部信息、主体内容和页脚等元素。在这个文件中,开发者会设置网站的基本布局、...

    宠物网站.zip

    网站设计可能还包括响应式布局,以适应不同设备的屏幕尺寸,确保用户在手机、平板或电脑上都能获得良好的浏览体验。此外,网站可能还整合了社交媒体链接,以便用户分享内容,或者有SEO优化,帮助网站在搜索引擎结果...

    新视角研究生英语读说写1部分答案

    【压缩包子文件的文件名称列表】中的文件可能分别对应课程的不同单元,如BI-U03_3EX.ppt可能是第三单元的练习讲解或答案解析,BI-U04_3EX.ppt可能是第四单元的内容。这些PPT文件可能包含了课件展示、习题解析、语言...

    21版高考数学人教A版浙江专用大一轮复习核心考点·精准研析 3.4.2 导数与函数零点 含解析.doc

    对于函数 \( g(x) = f(x) - 3ex - m \) 有两个零点的问题,意味着 \( g(x) \) 的图像与 \( x \) 轴有两个交点,这需要通过分析 \( g(x) \) 的导数,判断其单调性,以及端点和极值点的函数值来确定实数 \( m \) 的...

Global site tag (gtag.js) - Google Analytics