java面向切面编程---AOP之环绕通知
package com.xlkh.bigscreen.common.aspect; import com.alibaba.fastjson.JSON;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.xlkh.bigscreen.common.utils.RedisDeviceUtil;
import com.xlkh.bigscreen.service.bigscreen.BigscreenRedisService;
import com.xlkh.bigscreen.service.census.BigscreenCensusSqlService;
import lombok.SneakyThrows;
import net.sf.json.JSONArray;
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.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component; import javax.annotation.Resource;
import java.util.List;
import java.util.concurrent.TimeUnit; @Aspect
@Component
public class MyAspect { @Autowired
@Resource(name = "redisTemplate3")
private RedisTemplate<String, Object> redisTemplate;
@Autowired
private RedisDeviceUtil redisDeviceUtil;
@Value("${spring.redis3.database:3}")
private int database; String params=""; @Autowired
private BigscreenCensusSqlService bigscreenCensusSqlService; @Autowired
private BigscreenRedisService bigscreenRedisService; //这里是查询缓存的 所以应该放入缓存的操作
public Logger logger=LoggerFactory.getLogger(MyAspect.class); //定义切面
@Pointcut(value = "execution(* com.xlkh.bigscreen.controller.census.BigscreenCensusCommonController.getCensusBy*(..))")
public void myPointcut(){ } //定义环绕通知 缓存操作
@SneakyThrows
@Around("myPointcut()")
public Object cacheOperation(ProceedingJoinPoint proceedingJoinPoint){ //获取类名
String className=proceedingJoinPoint.getTarget().toString();
//获取方法名
String methodName=proceedingJoinPoint.getSignature().getName();
//获取参数
Object[] array=proceedingJoinPoint.getArgs();
ObjectMapper mapper=new ObjectMapper();
logger.info("方法执行之前--"+className+":"+methodName+"传递的参数--"+mapper.writeValueAsString(array));
String key="";
if (array.length>0){
for (int i = 0; i <array.length ; i++) {
if (null!=array[i]){
key=key.concat("_"+(String) array[i]);
}
}
}
int i = key.indexOf("_");
System.err.println("方法----"+methodName);
String redisKey="CACHE:"+key.substring(i+1,key.length());
//通过key去查询Redis的缓存
Object object = redisTemplate.opsForValue().get(redisKey);
if (null!=object){
logger.info("查询的是Redis的数据,查询的key是:"+redisKey);
JSONArray jsonArray = JSONArray.fromObject(object);
return jsonArray;
}
//Redis未查询到结果--查询相应的数据源
//环绕 控制整个目标函数去执行
List<Object> proceed = (List<Object>) proceedingJoinPoint.proceed(); if (proceed.size()==0){
redisTemplate.opsForValue().set(redisKey,"[]");
//10秒过期
redisTemplate.expire(redisKey,10, TimeUnit.SECONDS);
}else {
redisTemplate.opsForValue().set(redisKey, JSON.toJSONString(proceed));
// //2天过期
// redisTemplate.expire(redisKey,2, TimeUnit.DAYS);
//20秒过期
redisTemplate.expire(redisKey,20, TimeUnit.SECONDS);
} return proceed; }
}
接口的路径

使用AOP的作用其实就是在访问方法的时候,根据类名方法名以及传入的参数组装成redis的key,然后去redis查询数据
java面向切面编程---AOP之环绕通知的更多相关文章
- Spring学习手札(二)面向切面编程AOP
AOP理解 Aspect Oriented Program面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术. 但是,这种说法有些片面,因为在软件工程中,AOP的价值体现的并 ...
- Spring框架学习笔记(2)——面向切面编程AOP
介绍 概念 面向切面编程AOP与面向对象编程OOP有所不同,AOP不是对OOP的替换,而是对OOP的一种补充,AOP增强了OOP. 假设我们有几个业务代码,都调用了某个方法,按照OOP的思想,我们就会 ...
- Spring框架系列(4) - 深入浅出Spring核心之面向切面编程(AOP)
在Spring基础 - Spring简单例子引入Spring的核心中向你展示了AOP的基础含义,同时以此发散了一些AOP相关知识点; 本节将在此基础上进一步解读AOP的含义以及AOP的使用方式.@pd ...
- Spring学习笔记:面向切面编程AOP(Aspect Oriented Programming)
一.面向切面编程AOP 目标:让我们可以“专心做事”,避免繁杂重复的功能编码 原理:将复杂的需求分解出不同方面,将公共功能集中解决 *****所谓面向切面编程,是一种通过预编译方式和运行期动态代理实现 ...
- 04 Spring:01.Spring框架简介&&02.程序间耦合&&03.Spring的 IOC 和 DI&&08.面向切面编程 AOP&&10.Spring中事务控制
spring共四天 第一天:spring框架的概述以及spring中基于XML的IOC配置 第二天:spring中基于注解的IOC和ioc的案例 第三天:spring中的aop和基于XML以及注解的A ...
- Spring之控制反转——IoC、面向切面编程——AOP
控制反转——IoC 提出IoC的目的 为了解决对象之间的耦合度过高的问题,提出了IoC理论,用来实现对象之间的解耦. 什么是IoC IoC是Inversion of Control的缩写,译为控制 ...
- 【串线篇】面向切面编程AOP
面向切面编程AOP 描述:将某段代码“动态”的切入到“指定方法”的“指定位置”进行运行的一种编程方式 (其底层就是Java的动态代理)spring对其做了简化书写 场景: 1).AOP加日志保存到数据 ...
- 设计模式之面向切面编程AOP
动态的将代码切入到指定的方法.指定位置上的编程思想就是面向切面的编程. 代码只有两种,一种是逻辑代码.另一种是非逻辑代码.逻辑代码就是实现功能的核心代码,非逻辑代码就是处理琐碎事务的代码,比如说获取连 ...
- [译]如何在ASP.NET Core中实现面向切面编程(AOP)
原文地址:ASPECT ORIENTED PROGRAMMING USING PROXIES IN ASP.NET CORE 原文作者:ZANID HAYTAM 译文地址:如何在ASP.NET Cor ...
- Javascript aop(面向切面编程)之around(环绕)
Aop又叫面向切面编程,其中“通知”是切面的具体实现,分为before(前置通知).after(后置通知).around(环绕通知),用过spring的同学肯定对它非常熟悉,而在js中,AOP是一个被 ...
随机推荐
- 基础命令:dd、tar、ln、find、逻辑符号、alisa别名、md5sun校验、lrzsz文件上传下载、wget
目录 3.0 dd读取.转换并输出数据 3.1 压缩 (tar.zip).解压缩(tar xf.unzip) 3.2 ln软硬链接 3.2.1 软链接: 3.2.2 硬链接: 3.3 find文件查找 ...
- 数字先锋 | 打造专属AI大脑,天翼云助力重庆理工大学开启智慧校园新篇!
从在线课程的蓬勃兴起,到远程教育的逐渐普及,再到智能教学工具的广泛应用--人工智能.大数据.云计算等前沿技术迅速发展的当下,科技正以前所未有的深度和广度重塑教育领域,促使教育各个层面发生深刻变革.师生 ...
- 【Python】基础操作
指定解释器的运行环境 有时候我们会遇见报错 SyntaxError: Non-ASCII character '\xe4' in file E:/PycharmProjects/LEDdisplay2 ...
- Crealens.ai 免费体验GPT-4o 生图+吉卜力风格化
自己的一张日常照片,能在几秒内变身为一幅充满童话感的吉卜力风插画?90%的人不知道,如今只需一句话,就能在 ChatGPT 里实现"AI 生图"--这就是 GPT-4o 生图功能的 ...
- FREERTOS指令测试的思考
采用freertos编程后,有必要增加指令测试的功能: 1.便于对于软件各个子模块或功能点进行测试. 2.便于对硬件各个功能点是否正常进行测试. 在裸机编程中,我们一般使用串口进行运行数据的打 ...
- CentOS linux 安装openssl(openssl拒绝服务漏洞【CVE-2022-0778】解决)
一.安装 1.下载相关openssl包 下载地址: https://www.openssl.org/source/ 2.将下载好的压缩包放到 /app/server/nginx 路径下(根据自己实际需 ...
- C#关键字:in、out、ref、in T、out T、[In]、[Out]这些你都知道多少?
in.out 和 ref 关键字 首先我们来说in.out 和 ref ,在 C# 中,in.out 和 ref 是用于方法参数的引用传递.在引用传递过程中,形参和实参都是指向相同的引用地址. 名称 ...
- Golang服务可观测和思路分享
省流 中医四诊"望闻问切"与程序诊断有异曲同工之妙.在Golang问题排查中,我们需要建立系统化的诊断思维:通过观察表象(望).收集信息(闻).追溯根源(问).精准施治(切)四个维 ...
- Python3处理文档_word文档(三)_向word文档中添加表格
利用python-docx自动生成表格 add_table()方法会返回一个Table对象.rows代表行数,cols代表列数:style代表样式,具体可以查看官方文档. 一.创建一个8行5列的表格 ...
- java.lang.NoClassDefFoundError: org/apache/commons/collections/FastHashMap报错解决办法
在接收表单数据封装成对象时报错,具体错误信息如下: java.lang.reflect.InvocationTargetException at sun.reflect.NativeMetho ...