首页 > 代码库 > 基于 自定义注解 和 aop 实现使用memcache 对数据库的缓存 示例

基于 自定义注解 和 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=http://www.mamicode.com/OcsUtil.get(key);>


*1为了测试我在memCache中放的时候追加了一个字符串 “ cache” 

这个拦截器 使用 “方法的签名” 和 “参数转换成的json字符串” 作为 memCache的key 

就像这个样子 Object com.test.dao.TestDao.selectKeyValue(String,Integer)["1",2]

这样就可以保证memCache的存取与dao的操作对应了

这样就大功告成了。





基于 自定义注解 和 aop 实现使用memcache 对数据库的缓存 示例