springboot的代理模式示例----面向切面编程
1.定义切面类

2.编写切面类
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}")
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; }
}
3.controller使用切面
@ApiOperation("clickhouse通用查询接口")
@GetMapping("getCensusByCk")
public List<Object> getCensusByCk(@RequestParam(value = "sqlCode",required = false)String sqlCode, @RequestParam(value ="startTime",required = false)String startTime,
@RequestParam(value ="endTime",required = false)String endTime, @RequestParam(value ="param0",required = false)String param0,
@RequestParam(value ="format",required = false)String format, @RequestParam(value ="param1",required = false)String param1,
@RequestParam(value ="param2",required = false)String param2){
if (StringUtils.isBlank(sqlCode)){
return (List<Object>) Result.error("SQL标识不能为空!!!");
}
String sql=bigscreenCensusSqlService.queryByCode(sqlCode);
String results=bigscreenCensusSqlService.analyticalResults(sql,startTime,endTime,param0,format,param1,param2);
return bigscreenCensusSqlService.getCensusByCk(results);
}
@ApiOperation("mysql通用查询接口")
@GetMapping("getCensusByMysql")
public List<Object> getCensusByMysql(@RequestParam(value = "sqlCode",required = false)String sqlCode, @RequestParam(value ="startTime",required = false)String startTime,
@RequestParam(value ="endTime",required = false)String endTime, @RequestParam(value ="param0",required = false)String param0,
@RequestParam(value ="format",required = false)String format, @RequestParam(value ="param1",required = false)String param1,
@RequestParam(value ="param2",required = false)String param2){
if (StringUtils.isBlank(sqlCode)){
return (List<Object>) Result.error("SQL标识不能为空!!!");
}
String sql=bigscreenCensusSqlService.queryByCode(sqlCode);
String results=bigscreenCensusSqlService.analyticalResults(sql,startTime,endTime,param0,format,param1,param2);
return bigscreenCensusSqlService.getCensusByMysql(results);
}
@SneakyThrows
@ApiOperation("es通用查询接口")
@GetMapping("getCensusByEs")
public List<Object> getCensusByEs(String sqlCode,String startTime,String endTime,String param0,String param1,String param2){
if (StringUtils.isBlank(sqlCode)){
return (List<Object>) Result.error("SQL标识不能为空!!!");
}
String sql=bigscreenCensusSqlService.queryByCode(sqlCode);
String results=bigscreenCensusSqlService.analyticalResults2(sql,startTime,endTime,param0,param1,param2);
String index=bigscreenCensusSqlService.sqlIndexES();
return Collections.singletonList(bigscreenRedisService.getDataByEsJsonStr(results,index,null));
}
springboot的代理模式示例----面向切面编程的更多相关文章
- .NET Core 实现动态代理做AOP(面向切面编程)
1.介绍 1.1 动态代理作用 用动态代理可以做AOP(面向切面编程),进行无入侵式实现自己的扩展业务,调用者和被调用者之间的解耦,提高代码的灵活性和可扩展性,比如:日志记录.性能统计.安全控制.事务 ...
- javascript AOP(面向切面编程)
var func = function () { console.log("2") } Function.prototype.before = function (beforefn ...
- Java笔记——面向切面编程(AOP模式)
原文:http://www.cnblogs.com/yanbincn/archive/2012/06/01/2530377.html Aspect Oriented Programming 面向切面 ...
- JavaScript实现AOP(面向切面编程,装饰者模式)
什么是AOP? AOP(面向切面编程)的主要作用是把一些跟核心业务逻辑模块无关的功能抽离出来,这些跟业务逻辑无关的功能通常包括日志统计.安全控制.异常处理等.把这些功能抽离出来之后, 再通过“动态织入 ...
- 极简SpringBoot指南-Chapter05-SpringBoot中的AOP面向切面编程简介
仓库地址 w4ngzhen/springboot-simple-guide: This is a project that guides SpringBoot users to get started ...
- 基于SpringBoot AOP面向切面编程实现Redis分布式锁
基于SpringBoot AOP面向切面编程实现Redis分布式锁 基于SpringBoot AOP面向切面编程实现Redis分布式锁 基于SpringBoot AOP面向切面编程实现Redis分布式 ...
- 详细解读 Spring AOP 面向切面编程(一)
又是一个周末, 今天我要和大家分享的是 AOP(Aspect-Oriented Programming)这个东西,名字与 OOP 仅差一个字母,其实它是对 OOP 编程方式的一种补充,并非是取而代之. ...
- 面向切面编程AOP
本文的主要内容(AOP): 1.AOP面向切面编程的相关概念(思想.原理.相关术语) 2.AOP编程底层实现机制(动态代理机制:JDK代理.Cglib代理) 3.Spring的传统AOP编程的案例(计 ...
- C# 中使用面向切面编程(AOP)中实践代码整洁
1. 前言 最近在看<架构整洁之道>一书,书中反复提到了面向对象编程的 SOLID 原则(在作者的前一本书<代码整洁之道>也是被大力阐释),而面向切面编程(Aop)作为面向对象 ...
- C# 中使用面向切面编程(AOP)中实践代码整洁(转)
出处:https://www.cnblogs.com/chenug/p/9848852.html 1. 前言 最近在看<架构整洁之道>一书,书中反复提到了面向对象编程的 SOLID 原则( ...
随机推荐
- 扩展知识:vscode配置easyx
扩展知识:vscode配置easyx 前言 因为个人用习惯了vscode,对于visual studio的操作只能说相当程度上很不适应,因此,我打算经历一番配置,让vscode可以配置上easyx ...
- HIVE带中括号的列名取数
某次取数,某表中有奇怪的字段名:pointchange_ygz_[yyyy],带了个中插号,用简单查询出错 select pointchange_ygz_[yyyy] as p from t 出错信息 ...
- 带有可旋转摄像头的移动小车(urdf+rviz)
博客地址:https://www.cnblogs.com/zylyehuo/ 成果图 step1:新建工作空间 mkdir -p catkin_ws/src cd catkin_ws catkin_m ...
- Docker Swarm 进阶:集群容错
- 几款ZooKeeper可视化工具,最后一个美炸了~
首发于公众号:BiggerBoy 欢迎关注,查看更多技术文章 ZooKeeper是我们工作中常用一个开源的分布式协调服务,提供分布式数据一致性解决方案,分布式应用程序可以实现数据发布订阅.负载均衡.命 ...
- 详细介绍FutureTask类
一.详细介绍FutureTask类 FutureTask 未来将要执行的任务对象,继承 Runnable.Future 接口,用于包装 Callable 对象,实现任务的提交 public stati ...
- SynchronousQueue底层实现原理剖
一.SynchronousQueue底层实现原理剖 SynchronousQueue(同步移交队列),队列长度为0.作用就是一个线程往队列放数据的时候,必须等待另一个线程从队列中取走数据.同样,从队列 ...
- public void add(int index, E element)的方法源码分析
public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess ...
- Java 中的 young GC、old GC、full GC 和 mixed GC 的区别是什么?
Java 中的 young GC.old GC.full GC 和 mixed GC 的区别 在 Java 中,垃圾回收(GC)可以分为几种不同类型,包括 young GC.old GC.full G ...
- symfony框架安全组件(security)防火墙配置
最近改了下之前用symfony做的项目,然后,突然发现防火墙失效了,简单说就是再未登录状态下居然可以访问配置了ROLE_USER.ROLE_ADMIN这些权限的路由,symfony框架很强大,但是文档 ...