首页 > 编程语言 >springboot的代理模式示例----面向切面编程

springboot的代理模式示例----面向切面编程

时间:2024-03-13 14:23:12浏览次数:27  
标签:false String RequestParam 示例 required value ---- import 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));
    }

 

标签:false,String,RequestParam,示例,required,value,----,import,springboot
From: https://www.cnblogs.com/dabu/p/18070550

相关文章

  • 【教程】APP加固的那些小事情
     摘要APP加固是保护APP代码逻辑的重要手段,通过隐藏、混淆、加密等操作提高软件的逆向成本,降低被破解的几率,保障开发者和用户利益。本文将介绍APP加固常见失败原因及解决方法,以及处理安装出现问题的情况和资源文件加固策略选择。引言随着移动应用的普及,APP安全变得愈发重要,而A......
  • 官宣!前联邦快递亚太区董事总经理 Robin 加入 Tapdata 担任首席运营官
    日前,前联邦快递亚太区董事总经理、软件研发与管理专家RobinLosey,正式官宣加入Tapdata,并出任首席运营官(COO)。凭借其敏锐的商业洞察力、广博的技术知识以及辅导、培训和领导团队的能力,Robin将与创始人TJ共同带领管理团队,并领导整个研发团队,负责Tapdata实时数据平台产品各版......
  • ModuleNotFoundError: No module named ‘Crypto.Cipher‘或‘Crypto 的终极解决方案(
    转发源文档:https://juejin.cn/post/7120133494012903454 本文之前在c平台发布过,主要给出了此类问题的终极解决方案。亲测有效,且网友尝试后均解决问题! 长期以来,我对于ModuleNotFoundError:Nomodulenamed'Crypto.Cipher'问题和ModuleNotFoundError:Nomodulenamed'Cry......
  • 【论文阅读】THEMIS: Fair and Efficient GPU Cluster Scheduling
    11.THEMIS:FairandEfficientGPUClusterScheduling出处:2020USENIXThemis:公平高效的GPU集群调度|USENIX主要工作:使用拍卖机制,针对长时间运行、位置敏感的ML应用程序。任务以短期的效率公平来赢取投标但确保长期是完成时间公平性。对每个ML应用程序......
  • 4.MAC平台Python的下载、安装(含Python2.7+Python3.12双版本环境变量配置)——《跟老吕
    4.MAC平台Python的下载、安装(含Python2.7+Python3.12双版本环境变量配置)——《跟老吕学Python编程》)——跟老吕学Python编程一、下载MAC版Python1.Python官网2.MAC版Python下载网址二、在MAC安装Python1.在MAC安装Python2.阅读Python重要信息3.同意Python许可4.确认同意......
  • 二分查找
    题目描述:输入数组长度n输入数组a[1...n]输入查找个数m输入查找数字b[1...m]输出YESorNO查找有则YES否则NO。输入:输入有多组数据。每组输入n,然后输入n个整数,再输入m,然后再输入m个整数(1<=m,n<=100)。输出:如果在n个数组中输出YES否则输出NO。......
  • ThreadLocal底层原理
    ThreadLocal是Java中的一个线程局部变量工具类,它允许每个线程都有自己独立的变量副本,而不会相互干扰。ThreadLocal的底层原理涉及到ThreadLocalMap和Thread类。在ThreadLocal内部,使用一个ThreadLocalMap对象来存储每个线程对应的变量值。当调用set()方法设置......
  • 北大最新综述精读:RAG在AIGC中的前世今生,覆盖300篇论文!
    ©作者|Haoyang来源|神州问学如果你对这篇文章感兴趣,而且你想要了解更多关于AI领域的实战技巧,可以关注「神州问学」公众号。在这里,你可以看到最新最热的AIGC领域的干货文章和前沿资讯。引言:人工智能生成内容(AIGC)的不断发展得益于模型算法、可扩展的模型价格以及大规模......
  • mysql如何保证数据一致性
    MySQL保证数据一致性的主要方式有以下几种:事务支持:MySQL支持事务,通过事务可以保证数据库操作要么全部执行成功,要么全部失败回滚,从而确保数据的一致性。ACID特性:MySQL遵循ACID(原子性、一致性、隔离性、持久性)特性,其中一致性是指事务执行前后数据的状态保持一致。在事......
  • 如何配置极狐GitLab Runner Cache 缓存
    本文作者:徐晓伟GitLab是一个全球知名的一体化DevOps平台,很多人都通过私有化部署GitLab来进行源代码托管。极狐GitLab是GitLab在中国的发行版,专门为中国程序员服务。可以一键式部署极狐GitLab。极狐GitLabRunnerCache缓存支持S3标准协议,如:OSS、OOS等等支持S3......