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)
分享到:
相关推荐
下面将详细介绍SS3EX中使用UrlRewrite的相关知识点。 首先,URL重写主要是通过配置文件(如本例中的`urlrewrite.xml`)来实现的。这个配置文件定义了一系列规则,用于将原始URL转换为重写后的URL。在SS3EX框架中,`...
总结来说,这个项目是关于将ss3ex转换成一个支持Maven的Java项目,便于管理和构建,同时也可能提供了一种工具,帮助开发者在他们的工作中更高效地使用或集成ss3ex。通过博客链接提供的信息,读者可以深入了解这个...
2007卡耐基软件工程网路教材 SSD3ex2答案
ssd3ex5源码,自己写的,保证100分!
文件列表中的"ss3ex.bmp"可能是一个项目标识或图标,它可能包含了项目的视觉元素,帮助识别项目。而"ss3ex"可能是项目的主干代码或者扩展模块,包含了对SpringSide3核心功能的增强和定制。 这个项目的源代码分析,...
在标签中,“SSD3”可能是课程的代号,而“JAVA”则指明了编程语言,这意味着我们将探讨如何使用Java来处理与SSD相关的任务。Java是一种广泛使用的、跨平台的编程语言,非常适合开发系统级软件,包括SSD控制器或管理...
博客链接(https://ss3ex.iteye.com/blog/436901)可能包含了关于如何在Maven项目中集成和配置iBatis的实践教程,读者可以通过阅读该博客获取更具体的步骤和示例代码。 综上所述,"maven版ibatis"的主题涵盖了Maven...
派特莱LCE-A 多层信号灯2D CAD Pole M2pdf,特点:高节能无需维护的LED多层信号灯,体积小可识别性强,特别匹配于各类中小型设备的外观设计。派特莱特有的混合棱镜切割灯罩,消除了可能存在的视觉盲点,大大提高了远...
Sizzle 是一套前端用智能来处理模块和组件依赖关系的框架。 它遵循 CommonJS 的运行规范来完成对各个模块的动态加载。...Sizzle 框架将被使用在 PJBlog4 新版本中,让后台更加代码逻辑化和模块化。
它以其高容量、高速度、低成本和可靠性获得了广泛应用,尤其是在非营利组织中,如科罗拉多盲人护助中心。 1. **高容量与高速度**: AIT-3Ex是Sony AIT系列的升级版本,提供了显著的存储性能提升。在未压缩状态下,...
例如,`ch3ex6.m`, `ch3ex5.m`, `ch2ex3.m`, `ch4ex5a.m` 和 `ch2ex4.m` 可能是书中的练习题,每个对应一个特定章节的实例,可能涵盖了不同主题的MATLAB编程实践。 3. **图像处理**: 标签"图像处理与计算机视觉...
此外,注意到在代码中还有回调函数`CallbackFunc`的声明,但并没有给出具体的实现。在实际应用中,这个回调函数可以用来处理播放过程中的事件,如播放状态改变、错误发生等。然而,这个示例仅关注于读取和显示元数据...
3. **期望(数学期望)**(Expectation):随机变量的期望表示其平均值,如第4题中的EX=,第9题中的EX=np=1.6,第13题中的E(z)=3EX-2。 4. **方差(Variance)**:随机变量的方差衡量其数值离散程度,如第4题中的DX...
2. **适用**:此协议适用于所有使用HBP-9021/9020的通信场景,无论是在设备的开发阶段还是实际操作过程中。 3. **连接构成**:在PC与主CPU进行通信时,它们通过RS232C串行通信端口相连,具体是通过UART接口的TxD...
这个压缩包中的文件主要服务于创建一个功能完备、响应式的手机网站。 1. **index.html**:这是网站的主页模板。通常包含网站的导航、头部信息、主体内容和页脚等元素。在这个文件中,开发者会设置网站的基本布局、...
网站设计可能还包括响应式布局,以适应不同设备的屏幕尺寸,确保用户在手机、平板或电脑上都能获得良好的浏览体验。此外,网站可能还整合了社交媒体链接,以便用户分享内容,或者有SEO优化,帮助网站在搜索引擎结果...
【压缩包子文件的文件名称列表】中的文件可能分别对应课程的不同单元,如BI-U03_3EX.ppt可能是第三单元的练习讲解或答案解析,BI-U04_3EX.ppt可能是第四单元的内容。这些PPT文件可能包含了课件展示、习题解析、语言...
对于函数 \( g(x) = f(x) - 3ex - m \) 有两个零点的问题,意味着 \( g(x) \) 的图像与 \( x \) 轴有两个交点,这需要通过分析 \( g(x) \) 的导数,判断其单调性,以及端点和极值点的函数值来确定实数 \( m \) 的...