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. python3 报错ModuleNotFoundError: No module named 'apt_pkg'

    前言 apt update无法执行,python3 报错 ModuleNotFoundError: No module named 'apt_pkg' 这是因为将 python 版本升级后的问题 正确 ...

  2. 【Linux】3.7 定时任务调度

    3.7定时任务调度 1. 任务调度原理 crond任务调度:crontab进行定时任务调度 使用方法:crontab [选项] crontab [选项] -e:编辑crontab定时任务 -i:查询c ...

  3. Lazarus信创之路:启程,自动升级程序

    相信国内做Delphi开发的不在少数,信创大趋势下,很多转Lazarus开发了.最近我也研究了一下,决定也转到这下面来,主要考虑:1.商业化方便,无版权纠纷:2.兼容Delphi语法,上手很快:3.原 ...

  4. 2020年devops的7个发展趋势

    2020年devops的7个发展趋势 2019年对DevOps从业者来说是激动人心的一年,DevOps继续快速增长.大多数组织都在执行或评估他们的DevOps策略.那么,到2020年,DevOps.基 ...

  5. Unity Shader模板测试-描边

    Unity Shader模板测试描边效果,常用于 rpg 项目中主角被遮挡的情况,将被遮挡的部分的轮廓描边绘制出来,这样可以在任何情况都能知道主角在哪里.(还有另外一种就是使用X光效果,但这种效果不需 ...

  6. soapUI参数化总结

    1.新建项目目录 以获取用户贡献等级为例,目录如下: 2.添加DataSource和DataSource Loop 选中Test Step右键分别新建DataSource和DataSource Loo ...

  7. vue2&vue3&小程序简介

    Vue2.Vue3.小程序页面生命周期详解 本篇将对比 Vue2.Vue3 以及小程序页面/组件的生命周期,简单梳理各自特点.差异.新增优化点. Vue2 生命周期 beforeCreate → cr ...

  8. jmeter性能测试案例:电商系统并发订单测试

    场景描述:本案例主要实现多用户同时提交订单,以检测系统对瞬时压力的响应情况.具体流程包括用户登录-添加商品-提交订单.涉及多个接口联动和参数处理,步骤如下: 第一步,登录用户 1.新建"下订 ...

  9. eolinker解决两个变量合并成一个变量提供其他接口使用的方法

    特别注意:需要使用全局变量或者预处理前务必阅读本链接https://www.cnblogs.com/becks/p/13713278.html 场景描述:提交订单的接口请求中,有一参数是由商品价格+运 ...

  10. 2025dsfz集训Day6: 数论

    DAY6: 数论 \[Designed\ By\ FrankWkd\ -\ Luogu@Lwj54joy,uid=845400 \] 特别感谢 此次课的主讲 - Kwling 快速幂 快速幂是针对快速 ...