基于 自定义注解 和 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的操作对应了

这样就大功告成了。

时间: 2024-10-07 15:43:52

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

通过自定义注解与aop统一存储操作记录

模块开发完成后,接到通知需要添加操作记录功能,看着那一堆接口,如果一个方法一个方法的加,那真是太麻烦了.为了偷懒,就百度了一下,发现可以通过自定义注解和aop的形式来统一添加操作记录,只需要在每个方法上面添加自定义的注解就可以了.我在这里用的是springboot2.0以及jpa,废话不多说,直接上代码~ 自定义注解serverLog import java.lang.annotation.ElementType; import java.lang.annotation.Retention; i

SpringBoot利用自定义注解实现AOP

SpringBoot利用自定义注解实现AOP java 本文主要讲解利用SpringBoot的自定义注解来实现AOP思想. 在开始所有的操作之前,需要导入aop坐标: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> 如何自定义注解? 实际上注解本

自定义注解实现AOP日志记录

自定义注解 package com.annotation; import java.lang.annotation.*; /** *自定义注解 拦截Controller */ @Target({ElementType.PARAMETER, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface SystemLog { String module() default ""

使用自定义注解和AOP管理shiro权限

一.场景 在使用shiro框架的时候,遇到了这样的需求:本系统有多个用户,每个用户分配不同角色,每个角色的权限也不一致.比如A用户拥有新闻列表的增删改查权限,而B用户只有查看新闻列表的权限,而没有删除.新增.修改的权限,此时有3种方案:1.不给B用户分配删除.新增.修改的菜单,这样用户就无法点击从而无法操作.2.给B用户分配菜单,后台中进行增删改查操作时都要进行权限验证.  3.给B用户分配菜单并且进行操作的时候校验权限. 显然,第2.3种方案比第1中方案要安全.本系统中使用第二种方案. 二.为

参数上使用自定义注解在aop中无法获取到该参数

https://ask.csdn.net/questions/769477 /** * 环绕增强,验证权限 * @param joinPoint 目标对象 * @param authCheck 自定义的注解,Around必须这样写,否则自定义的注解无法传入 * */ @Around("pointAll() && @annotation(authCheck)") public Object before(ProceedingJoinPoint joinPoint, Aut

自定义注解-基于AOP

依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> 注解1(不带参数): /** * sea test 使用 AOP 自定义注解(不带参数) * @author sea * */ @Target({ElementType.METHOD}) @

使用Spring Aop自定义注解实现自动记录日志

百度加自己琢磨,以下亲测有效,所以写下来记录,也方便自己回顾浏览加深印象之类,有什么问题可以评论一起解决,不完整之处也请大佬指正,一起进步哈哈(1)首先配置文件: <!-- 声明自动为spring容器中配置@aspectj切面的bean创建代理 ,织入切面 --> <aop:aspectj-autoproxy /> <!-- 开启注解扫描 --> <context:component-scan base-package="com.ky.zhjd.**&q

spring AOP + 自定义注解实现权限控制小例子

今天看了一下黑马程序员的视频,上面讲到一个使用spring AOP + 自定义注解的方式来实现权限控制的一个小例子,个人觉得还是可以借鉴,整理出来与大家分享. 需求:service层有一些方法,这些方法需要不同的权限才能访问. 实现方案:自定义一个PrivilegeInfo的注解,使用这个注解为service层中的方法进行权限配置,在aop中根据PrivilegeInfo注解的值,判断用户是否拥有访问目标方法的权限,有则访问目标方法,没有则给出提示. 关键技术:自定义注解及注解解析,spring

spring AOP自定义注解方式实现日志管理

转:spring AOP自定义注解方式实现日志管理 今天继续实现AOP,到这里我个人认为是最灵活,可扩展的方式了,就拿日志管理来说,用Spring AOP 自定义注解形式实现日志管理.废话不多说,直接开始!!! 关于配置我还是的再说一遍. 在applicationContext-mvc.xml中要添加的 <mvc:annotation-driven />     <!-- 激活组件扫描功能,在包com.gcx及其子包下面自动扫描通过注解配置的组件 -->     <conte