好久没更新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 对数据库的缓存 演示样例的更多相关文章

  1. c#Winform程序的toolStripButton自己定义背景应用演示样例源代码

    C# Winform程序的toolStrip中toolStripButton的背景是蓝色的,怎样改变背景及边框的颜色和样式呢? 实现此功能须要重写toolStripButton的Paint方法 这里仅 ...

  2. 01_MUI之Boilerplate中:HTML5演示样例,动态组件,自己定义字体演示样例,自己定义字体演示样例,图标字体演示样例

     1安装HBuilder5.0.0,安装后的界面截图例如以下: 2 依照https://www.muicss.com/docs/v1/css-js/boilerplate-html中的说明,创建上 ...

  3. TreeSet排序,存储自己定义对象,自己定义比較器演示样例

    Set:无序.不能够反复元素. |--HashSet:数据结构是哈希表.线程是非同步的. 保证元素唯一性的原理:推断元素的hashCode值是否同样. 假设同样,还会继续推断元素的equals方法.是 ...

  4. 基于spring@aspect注解的aop实现

    第一步:编写切面类 package com.dascom.hawk.app.web.tool; import org.aspectj.lang.JoinPoint; import org.aspect ...

  5. AOP经典2种配置演示样例

    第一种: 使用aop指定切面aspect. <bean id="LogAdvice" class="com.thinkmore.framework.monitor. ...

  6. 怎样自己定义注解Annotation,并利用反射进行解析

    Java注解可以提供代码的相关信息,同一时候对于所注解的代码结构又没有直接影响.在这篇教程中,我们将学习Java注解,怎样编写自己定义注解.注解的使用,以及怎样使用反射解析注解. 注解是Java 1. ...

  7. 最简单的基于FFmpeg的移动端样例:Android HelloWorld

    ===================================================== 最简单的基于FFmpeg的移动端样例系列文章列表: 最简单的基于FFmpeg的移动端样例:A ...

  8. 最简单的基于FFmpeg的移动端样例:IOS 视频解码器

    ===================================================== 最简单的基于FFmpeg的移动端样例系列文章列表: 最简单的基于FFmpeg的移动端样例:A ...

  9. 最简单的基于FFmpeg的移动端样例:Windows Phone HelloWorld

    ===================================================== 最简单的基于FFmpeg的移动端样例系列文章列表: 最简单的基于FFmpeg的移动端样例:A ...

随机推荐

  1. 2014阿里巴巴web前实习生项目分析(1)

    以下简化CSS代码: div.container{ width:500px; background-image:url(/img/sprite.png); background-repeat:no-r ...

  2. C#中调用c++的dll

    C#中调用c++的dll具体创建与调用步骤,亲测有效~   使用的工具是VS2010哦~其他工具暂时还没试过 我新建的工程名是my21dll,所以会生成2个同名文件.接下来需要改动的只有画横线的部分 ...

  3. 单元测试React

    React单元测试——十八般兵器齐上阵,环境构建篇 一个完整.优秀的项目往往离不开单元测试的环节,就 github 上的主流前端项目而言,基本都有相应的单元测试模块. 就 React 的项目来说,一套 ...

  4. Binary Tree Inorder Traversal(转)

    Given a binary tree, return the inorder traversal of its nodes' values. For example: Given binary tr ...

  5. Chapter 1 Securing Your Server and Network(12):保护链接server

    原文出处:http://blog.csdn.net/dba_huangzj/article/details/38438363.专题文件夹:http://blog.csdn.net/dba_huangz ...

  6. HihoCoder——Trie树

    本文出自:http://blog.csdn.net/svitter 原题:http://hihocoder.com/contest/hiho2/problem/1 题解:使用Trie树..基础题目.一 ...

  7. HDU 4832(DP+计数问题)

    HDU 4832 Chess 思路:把行列的情况分别dp求出来,然后枚举行用几行,竖用几行.然后相乘累加起来就是答案 代码: #include <stdio.h> #include < ...

  8. java内存分析总结

    1.自带的jconsole工具. (1)假设是从命令行启动,使 JDK 在 PATH 上,执行 jconsole 就可以. (2)假设从 GUI shell 启动,找到 JDK 安装路径,打开 bin ...

  9. OpenGL 实现Interpolation插值算法

    这是一个静态插值算法的效果,图形学中插值算法应用十分广.如动画.photoshop, autocAD等软件画曲线,还有shader中的渐变上色也是一个硬件支持的插值算法. Interpolation是 ...

  10. 在win7在结构cocos2d-x v3.2rc0开发环境(For Android)

    cocos2d-x 这是现在比较流行的游戏引擎., 因此.本文的目的在于教导新手怎样在win7下建立cocos2dx开发环境, 截止本文,cocos2dx的最新版本号为 v3.2rc0版,我将如果您的 ...