基于 自己定义注解 和 aop 实现使用memcache 对数据库的缓存 演示样例
好久没更新blog了,在新公司打拼了两个月,每天都从早忙到晚,学到了非常多东西,可是没有时间来更新blog了。。。。
以下開始解说这次的主题
公司老大让我研究 ocs 就是阿里云的 开放缓存服务 点击打开链接
事实上就是一个memcache的服务
memchech 就是用内存来存放 key -value 在一些情况下就不必频繁的訪问 数据库了(事实上就是个map)
怎样在经常使用的Dao中方便的使用这个map呢,我首先想到了 aop,然后又想到了自己定义注解,那么就開始干吧。。。。
aop动态代理要使用的jar包例如以下
aspectjrt-1.6.12.jar(jdk7.0 须要这么高的版本号,否则报错)
aspectjweaver-1.6.12.jar
cglib-nodep-2.2.jar
com.springsource.org.aopalliance-1.0.0.jar
和其它的spring包请自行搜索
spring加上这一行 开启自己主动代理:
<aop:aspectj-autoproxy/>
我的spring配置
<?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:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd "> <!-- 默认扫描的包路径 -->
<context:component-scan base-package="com.test" />
<!-- 加入注解驱动 -->
<mvc:annotation-driven /> <aop:aspectj-autoproxy/> </beans>
首先模拟一个 memCache 我写了一个工具类
package com.test.action; import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ExecutionException; public class OcsUtil { private static Map<String, Object> memMap=new HashMap<String, Object>();
//模拟
public static void add(String key,Object val) throws IOException, InterruptedException, ExecutionException{
memMap.put(key, val);
}
//模拟
public static Object get(String key) throws IOException{
return memMap.get(key);
} }
这个就临时取代memCached吧。
dao层:
package com.test.dao; import org.springframework.stereotype.Repository; import com.test.aop.MemCache; @Repository
public class TestDao { @MemCache
public Object selectKeyValue(String arg1,Integer arg2){
return "12345";
}
}
两个參数随便写的,这样用来模拟真实情况下的多个查询參数
方法名上的@MemCache 注解 就是我自定义的注解,当拥有这个注解的方法在调用时首先会在memCache中去找,这样就提高了性能
自己定义注解例如以下:
package com.test.aop; import java.lang.annotation.*;
import static java.lang.annotation.ElementType.*; @Target({METHOD})
@Retention(RetentionPolicy.CLASS)
public @interface MemCache { }
我们要做的就是用aop拦截 拥有@MemCache注解的方法,然后处理它。以下是aop拦截器
package com.test.aop; import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component; import com.google.gson.Gson;
import com.test.action.OcsUtil; @Component
@Aspect
public class MemCacheInterceptor {
private Gson gson=new Gson(); @Pointcut("execution(* com.test.dao.TestDao.select*(..))&& @annotation(com.test.aop.MemCache)")
private void theMethod(){}//定义一个切入点 @Around("theMethod()")
public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable{ String key=pjp.getSignature().toString();
key+=gson.toJson(pjp.getArgs()); Object memValue=OcsUtil.get(key); if(memValue!=null){
System.out.println("memcache获取到");
return memValue;
}
Object object = pjp.proceed();//运行该方法 OcsUtil.add(key, object+" cache");
System.out.println("db获取");
return object;
}
}
*1为了測试我在memCache中放的时候追加了一个字符串 “ cache”
这个拦截器 使用 “方法的签名” 和 “參数转换成的json字符串” 作为 memCache的key
就像这个样子 Object com.test.dao.TestDao.selectKeyValue(String,Integer)["1",2]
这样就能够保证memCache的存取与dao的操作相应了
这样就大功告成了。
基于 自己定义注解 和 aop 实现使用memcache 对数据库的缓存 演示样例的更多相关文章
- c#Winform程序的toolStripButton自己定义背景应用演示样例源代码
C# Winform程序的toolStrip中toolStripButton的背景是蓝色的,怎样改变背景及边框的颜色和样式呢? 实现此功能须要重写toolStripButton的Paint方法 这里仅 ...
- 01_MUI之Boilerplate中:HTML5演示样例,动态组件,自己定义字体演示样例,自己定义字体演示样例,图标字体演示样例
1安装HBuilder5.0.0,安装后的界面截图例如以下: 2 依照https://www.muicss.com/docs/v1/css-js/boilerplate-html中的说明,创建上 ...
- TreeSet排序,存储自己定义对象,自己定义比較器演示样例
Set:无序.不能够反复元素. |--HashSet:数据结构是哈希表.线程是非同步的. 保证元素唯一性的原理:推断元素的hashCode值是否同样. 假设同样,还会继续推断元素的equals方法.是 ...
- 基于spring@aspect注解的aop实现
第一步:编写切面类 package com.dascom.hawk.app.web.tool; import org.aspectj.lang.JoinPoint; import org.aspect ...
- AOP经典2种配置演示样例
第一种: 使用aop指定切面aspect. <bean id="LogAdvice" class="com.thinkmore.framework.monitor. ...
- 怎样自己定义注解Annotation,并利用反射进行解析
Java注解可以提供代码的相关信息,同一时候对于所注解的代码结构又没有直接影响.在这篇教程中,我们将学习Java注解,怎样编写自己定义注解.注解的使用,以及怎样使用反射解析注解. 注解是Java 1. ...
- 最简单的基于FFmpeg的移动端样例:Android HelloWorld
===================================================== 最简单的基于FFmpeg的移动端样例系列文章列表: 最简单的基于FFmpeg的移动端样例:A ...
- 最简单的基于FFmpeg的移动端样例:IOS 视频解码器
===================================================== 最简单的基于FFmpeg的移动端样例系列文章列表: 最简单的基于FFmpeg的移动端样例:A ...
- 最简单的基于FFmpeg的移动端样例:Windows Phone HelloWorld
===================================================== 最简单的基于FFmpeg的移动端样例系列文章列表: 最简单的基于FFmpeg的移动端样例:A ...
随机推荐
- Mongodb安装和配置
Mongodb之安装配置 安装 Mongodb的下载地址为Mongodb官网.下载时.你能够选择是安装包或者是压缩包. 下载完毕后.双击安装包并安装. 安装完毕后.你能够在安装文件夹看到下图中所见的文 ...
- yate.conf
但档案.粘贴下面的例子.不解释!除去非常灵活!只保留sip电话! [general] ; General settings for the operation of Yate ; modload: b ...
- C#启动进程之Process
在程序设计中,我们经常会遇到要从当前的程序跳到另一个程序的设计需求.也就是当前进程创建另一个进程.C#提供了Process使得我们很方便的实现. 1.Process基本属性和方法 Id //进程的Id ...
- 关系数据库的基本概念和MySQL说明
关系数据库的基本概念 数据库: 大量的信息化解决方案的高效管理. 根据数据结构来组织.存储和管理数据的库. 数据库系统(DBS,DATABASE SYSTEM): 数据库(DB,DATABASE) + ...
- crm2011i创建nt类型字段
using System; using Microsoft.Xrm.Sdk; using Microsoft.Xrm.Sdk.Messages; using Microsoft ...
- Swift编程语言学习1.3——类型安全和投机型
Swift 是类型安全(type safe )语言.类型安全的语言可以让你清楚地知道代码被处理值类型.假设你需要一个代码String.你绝对不能进去一个不小心传球Int. 因为 Swift 它是类型安 ...
- android tips—NumberPicker,DataPicker,TimePicker样式改动
在使用NumberPicker.DataPicker,TimePicker这几个控件时,非常easy出现例如以下这个界面 可是我们想要的却是以下图示的结果 改动Application.activity ...
- SQL Server中TempDB管理(version store的逻辑结构)
原文:SQL Server中TempDB管理(version store的逻辑结构) 原文来自: http://blogs.msdn.com/b/sqlserverstorageengine/arch ...
- UVa 208 - Firetruck 回溯+剪枝 数据
题意:构造出一张图,给出一个点,字典序输出所有从1到该点的路径. 裸搜会超时的题目,其实题目的数据特地设计得让图稠密但起点和终点却不相连,所以直接搜索过去会超时. 只要判断下起点和终点能不能相连就行了 ...
- cocos2dx 3.x Value、Vector和Map意识
1. Value cocos2d::Value 这包括一个非常大的数字原生类型(int,float,double,bool,unsigned char,char* 和 std::string)外 加s ...