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之环绕通知的更多相关文章

  1. Spring学习手札(二)面向切面编程AOP

    AOP理解 Aspect Oriented Program面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术. 但是,这种说法有些片面,因为在软件工程中,AOP的价值体现的并 ...

  2. Spring框架学习笔记(2)——面向切面编程AOP

    介绍 概念 面向切面编程AOP与面向对象编程OOP有所不同,AOP不是对OOP的替换,而是对OOP的一种补充,AOP增强了OOP. 假设我们有几个业务代码,都调用了某个方法,按照OOP的思想,我们就会 ...

  3. Spring框架系列(4) - 深入浅出Spring核心之面向切面编程(AOP)

    在Spring基础 - Spring简单例子引入Spring的核心中向你展示了AOP的基础含义,同时以此发散了一些AOP相关知识点; 本节将在此基础上进一步解读AOP的含义以及AOP的使用方式.@pd ...

  4. Spring学习笔记:面向切面编程AOP(Aspect Oriented Programming)

    一.面向切面编程AOP 目标:让我们可以“专心做事”,避免繁杂重复的功能编码 原理:将复杂的需求分解出不同方面,将公共功能集中解决 *****所谓面向切面编程,是一种通过预编译方式和运行期动态代理实现 ...

  5. 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 ...

  6. Spring之控制反转——IoC、面向切面编程——AOP

      控制反转——IoC 提出IoC的目的 为了解决对象之间的耦合度过高的问题,提出了IoC理论,用来实现对象之间的解耦. 什么是IoC IoC是Inversion of Control的缩写,译为控制 ...

  7. 【串线篇】面向切面编程AOP

    面向切面编程AOP 描述:将某段代码“动态”的切入到“指定方法”的“指定位置”进行运行的一种编程方式 (其底层就是Java的动态代理)spring对其做了简化书写 场景: 1).AOP加日志保存到数据 ...

  8. 设计模式之面向切面编程AOP

    动态的将代码切入到指定的方法.指定位置上的编程思想就是面向切面的编程. 代码只有两种,一种是逻辑代码.另一种是非逻辑代码.逻辑代码就是实现功能的核心代码,非逻辑代码就是处理琐碎事务的代码,比如说获取连 ...

  9. [译]如何在ASP.NET Core中实现面向切面编程(AOP)

    原文地址:ASPECT ORIENTED PROGRAMMING USING PROXIES IN ASP.NET CORE 原文作者:ZANID HAYTAM 译文地址:如何在ASP.NET Cor ...

  10. Javascript aop(面向切面编程)之around(环绕)

    Aop又叫面向切面编程,其中“通知”是切面的具体实现,分为before(前置通知).after(后置通知).around(环绕通知),用过spring的同学肯定对它非常熟悉,而在js中,AOP是一个被 ...

随机推荐

  1. go 结构体根据某个字段进行排序

    前言 在任何编程语言中,关乎到数据的排序都会有对应的策略,我们来看下 Golang 是怎样对数据进行排序,以及我们如何优化处理使用 go 排序 go 可以针对任何对象排序,虽然很多情况下是一个 sli ...

  2. Linux之SELinux的开启、关闭。

    SELinux简介 SELinux 是Security-Enhanced Linux的简写,意指安全增强的linux.它不是用来防火墙设置的.但它对Linux系统的安全很有用.Linux内核(Kern ...

  3. Linux系统查看CPU使用率、内存使用率、磁盘使用率

    一.查看CPU使用率1. top 命令[root@sss ~]# toptop - 16:54:38 up 7 days,  5:13,  3 users,  load average: 0.00, ...

  4. MQTT协议发布和订阅的实现,一步步带你实现发布订阅服务。

    MQTT协议 MQTT协议是基于TCP传输协议之上的应用层协议,全程Message Queuing Telemetry Transport.主要用于物联网设备间的通信,在低带宽.不稳定网络环境下的优势 ...

  5. DevOps常用工具网址

    Linux基础和命令: shell语法查询: http://www.linux6.comhttps://www.tutorialspoint.com/linux_admin/index.htm 正则表 ...

  6. eolinker同一个自动化用例内执行不同端接口遇到的问题(主要是两套host环境共存的问题)解决方法

    特别注意:需要使用全局变量或者预处理前务必阅读本链接https://www.cnblogs.com/becks/p/13713278.html eolinker内同一套环境只能配置一个host地址,如 ...

  7. MySQL 中 varchar 和 char 有什么区别?

    MySQL 中 varchar 和 char 的区别 在 MySQL 中,VARCHAR 和 CHAR 是两种常用的字符串类型,它们在存储方式.长度限制和使用场景等方面存在显著区别. 1. 定义与存储 ...

  8. 2025dsfzB层考试总结

    2025年东师附中B层春季测试1考试总结 Designed By Lwj54joy AT 2025-03-01 本文将遵守GNU GPL2.0开源协议. 概述 总分:\(310/400\) 改题分数: ...

  9. configfs-用户空间控制的内核对象配置

    1. 什么是configfs? configfs 是一个基于内存的文件系统,它提供了与sysfs相反的功能.sysfs 是一个基于文件系统的内核对象视图,而configfs 是一个基于文件系统的内核对 ...

  10. c#使用内存映射像处理内存一样去快速处理文件

    在 .NET Core 中,`System.IO.MemoryMappedFiles.MemoryMappedFile` 类提供了对内存映射文件的支持.通过将文件映射到内存,你可以在应用程序中直接访问 ...