好久没更新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. Mongodb安装和配置

    Mongodb之安装配置 安装 Mongodb的下载地址为Mongodb官网.下载时.你能够选择是安装包或者是压缩包. 下载完毕后.双击安装包并安装. 安装完毕后.你能够在安装文件夹看到下图中所见的文 ...

  2. yate.conf

    但档案.粘贴下面的例子.不解释!除去非常灵活!只保留sip电话! [general] ; General settings for the operation of Yate ; modload: b ...

  3. C#启动进程之Process

    在程序设计中,我们经常会遇到要从当前的程序跳到另一个程序的设计需求.也就是当前进程创建另一个进程.C#提供了Process使得我们很方便的实现. 1.Process基本属性和方法 Id //进程的Id ...

  4. 关系数据库的基本概念和MySQL说明

    关系数据库的基本概念 数据库: 大量的信息化解决方案的高效管理. 根据数据结构来组织.存储和管理数据的库. 数据库系统(DBS,DATABASE SYSTEM): 数据库(DB,DATABASE) + ...

  5. crm2011i创建nt类型字段

    using System;     using Microsoft.Xrm.Sdk;     using Microsoft.Xrm.Sdk.Messages;     using Microsoft ...

  6. Swift编程语言学习1.3——类型安全和投机型

    Swift 是类型安全(type safe )语言.类型安全的语言可以让你清楚地知道代码被处理值类型.假设你需要一个代码String.你绝对不能进去一个不小心传球Int. 因为 Swift 它是类型安 ...

  7. android tips—NumberPicker,DataPicker,TimePicker样式改动

    在使用NumberPicker.DataPicker,TimePicker这几个控件时,非常easy出现例如以下这个界面 可是我们想要的却是以下图示的结果 改动Application.activity ...

  8. SQL Server中TempDB管理(version store的逻辑结构)

    原文:SQL Server中TempDB管理(version store的逻辑结构) 原文来自: http://blogs.msdn.com/b/sqlserverstorageengine/arch ...

  9. UVa 208 - Firetruck 回溯+剪枝 数据

    题意:构造出一张图,给出一个点,字典序输出所有从1到该点的路径. 裸搜会超时的题目,其实题目的数据特地设计得让图稠密但起点和终点却不相连,所以直接搜索过去会超时. 只要判断下起点和终点能不能相连就行了 ...

  10. cocos2dx 3.x Value、Vector和Map意识

    1. Value cocos2d::Value 这包括一个非常大的数字原生类型(int,float,double,bool,unsigned char,char* 和 std::string)外 加s ...