此方案借助aop自定义注解来创建redis缓存机制。

1、创建自定义注解类

package com.tp.soft.common.util;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; @Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface CacheAnnotation {
String name() default "";
String value() default "";
}

2、创建aop切面类

package com.tp.soft.aop;

import java.lang.reflect.Field;
import java.lang.reflect.Method; import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature; import com.tp.soft.common.util.CacheAnnotation;
import com.tp.soft.entity.User;
import com.tp.soft.redis.RedisCacheAn; @Aspect
public class CacheRedisAop { @Pointcut("@annotation(com.tp.soft.common.util.CacheAnnotation)")
public void pointCutMethod(){ } @Around("pointCutMethod()")
public Object around(ProceedingJoinPoint pjp) throws Throwable{
//获取缓存的唯一key格式ID
String cacheKey = getCacheKey(pjp); RedisCacheAn ra = new RedisCacheAn(cacheKey);
//从redis获取缓存数据
Object obj = (Object) ra.getObject(cacheKey);
//存在直接返回,不再接下去执行查询数据库操作
if(obj != null){
return obj;
} //不存在执行数据库操作
Object proceed = pjp.proceed(); //将查询的对象存入redis缓存
ra.putObject(cacheKey,proceed);
return proceed;
} private String getCacheKey(ProceedingJoinPoint pjp) throws NoSuchMethodException, SecurityException {
Signature signature = pjp.getSignature();
MethodSignature methodSignature = (MethodSignature) signature;
Method targetMethod = methodSignature.getMethod(); Class<? extends Object> cls = pjp.getTarget().getClass(); Object[] args = pjp.getArgs(); Method method = cls.getDeclaredMethod(signature.getName(), targetMethod.getParameterTypes()); String name = method.getAnnotation(CacheAnnotation.class).name();
String value = method.getAnnotation(CacheAnnotation.class).value();
String[] split = value.split(","); for (String field : split) {
name += "." + field;
} String id = ""; if(args != null && args.length>0){
id = String.valueOf(args[0]);
} name += "=" + id;
String redisKey = method + "." + name;
//查询缓存是否存在
return redisKey;
}
}

切面注解@annotation 只要在方法上注解@CacheAnnotation  就进入AOP该类进行处理,所以在要进入缓存机制的业务层注入这个写的自定义注解,具体的一些redis获取缓存链接对象的类在之前的

ssm+redis整合(通过cache方式)

ssm+redis整合之redis连接池注入

都有写到,可以参考

3、接下来就是在业务层需要缓存的方法上加入注解就可以了,其中name 和value 2个属性主要是为了生成唯一的redis  keyid

package com.tp.soft.service.sys.impl;

import javax.annotation.Resource;

import org.springframework.stereotype.Service;

import com.tp.soft.common.exception.BaseServiceException;
import com.tp.soft.common.util.CacheAnnotation;
import com.tp.soft.dao.UserMapper;
import com.tp.soft.entity.User;
import com.tp.soft.service.sys.UserSvc; @Service("userService")
public class UserSvcImpl implements UserSvc{ @Resource
private UserMapper userMapper; @CacheAnnotation(name="user",value="id")
public User getUser(int id) throws BaseServiceException{
return userMapper.getUserById(id);
} }

ssm+redis整合(通过aop自定义注解方式)的更多相关文章

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

    今天继续实现AOP,到这里我个人认为是最灵活,可扩展的方式了,就拿日志管理来说,用Spring AOP 自定义注解形式实现日志管理.废话不多说,直接开始!!! 关于配置我还是的再说一遍. 在appli ...

  2. springboot aop 自定义注解方式实现完善日志记录(完整源码)

    版权声明:本文为博主原创文章,欢迎转载,转载请注明作者.原文超链接 一:功能简介 本文主要记录如何使用aop切面的方式来实现日志记录功能. 主要记录的信息有: 操作人,方法名,参数,运行时间,操作类型 ...

  3. springboot aop 自定义注解方式实现一套完善的日志记录(完整源码)

    https://www.cnblogs.com/wenjunwei/p/9639909.html https://blog.csdn.net/tyrant_800/article/details/78 ...

  4. ssm+redis整合(通过cache方式)

    这几天的研究ssm redis 终于进入主题了,今天参考了网上一些文章搭建了一下ssm+redis整合,特别记录下来以便以后可以查询使用,有什么不足请大牛们提点 项目架构 1.pom.xml < ...

  5. redis分布式锁-spring boot aop+自定义注解实现分布式锁

    接这这一篇redis分布式锁-java实现末尾,实现aop+自定义注解 实现分布式锁 1.为什么需要 声明式的分布式锁 编程式分布式锁每次实现都要单独实现,但业务量大功能复杂时,使用编程式分布式锁无疑 ...

  6. SpringBoot系列(十三)统一日志处理,logback+slf4j AOP+自定义注解,走起!

    往期精彩推荐 SpringBoot系列(一)idea新建Springboot项目 SpringBoot系列(二)入门知识 springBoot系列(三)配置文件详解 SpringBoot系列(四)we ...

  7. 利用Spring AOP自定义注解解决日志和签名校验

    转载:http://www.cnblogs.com/shipengzhi/articles/2716004.html 一.需解决的问题 部分API有签名参数(signature),Passport首先 ...

  8. spring AOP自定义注解 实现日志管理

    今天继续实现AOP,到这里我个人认为是最灵活,可扩展的方式了,就拿日志管理来说,用Spring AOP 自定义注解形式实现日志管理.废话不多说,直接开始!!! 关于配置我还是的再说一遍. 在appli ...

  9. (转)利用Spring AOP自定义注解解决日志和签名校验

    一.需解决的问题 部分API有签名参数(signature),Passport首先对签名进行校验,校验通过才会执行实现方法. 第一种实现方式(Origin):在需要签名校验的接口里写校验的代码,例如: ...

随机推荐

  1. 学习git之路--1

    1. 在文件内右键选择git.bash2.打开工具后,输入git init 创建.init文件3.git config --global 'sk' 创建用户名4.git config --global ...

  2. Xamarin.Forms FlexLayout 布局扩展+ 模板扩展+弹性换行

    Binding a FlexLayout to a Collection   In May we published a doc on the new FlexLayout control that’ ...

  3. ShellExecute 打开网页、目录、邮箱

    #include <Windows.h> #include <tchar.h> int WINAPI _tWinMain(HINSTANCE hInstance, HINSTA ...

  4. Maven 学习笔记-maven属性

    Maven有六类属性: 1)内置属性 主要有两个常用内置属性 ${basedir}:表示项目根目录,即包含pom.xml文件的目录: ${version}:表示项目版本: 2)POM属性 ${M2_H ...

  5. [经验共享] MapGIS实用小功能图解——由excel文件导成MapGIS点文件

    项目小组的几个成员都是学地下水和环境的,对于GIS懂得不是很多,于是把一些我们经常用到的mapgis实用小功能做成帮助文档,方便大家使用,发布共享! 1.整理好EXCEL文件(注意X,Y坐标的正确性( ...

  6. web接口文档apidoc的使用

    1.安装 npm install apidoc -g 2.新建src文件夹,里面放2个文件,test.js和apidoc.json 3.test.js /** * @api {get} /query_ ...

  7. 多个for循环嵌套会影响速度

    在复现Meta-SR的过程中,发现如果嵌套多个for 循环会使速度过慢.这是下面实验得出的结论: import time t1 = time.time() a = range(3000) b = ra ...

  8. 使用4K分辨率,然后放大DIP200%,软件界面异常.

    简单:WFM主界面.AutoScaleMode  选中DIP,然后使用表格容器,容器分割,容器.就可以快速迁移旧程序. 复杂点:读取桌面分辨率,DIP放大....

  9. php 防跨站表单提交

    一种最优方式防跨站表单提交,用户限时token 就是生成一个随机且变换频繁加密字符串(可逆和不可逆).放在表单中,等到表单提交后检查. 这个随机字符串如果和当前用户身份相关联的话,那么攻击者伪造请求会 ...

  10. html中div标签怎么用?

    div现在一般网页的布局都是使用的div+css来布局,div的话,就是通过. <div> <div><p></p></div> </ ...