当前位置: 首页 > article >正文

AOP基于注解的切面表达式

1.第一种就是最为普遍的表达式

    /**
     * 定义controller切入点拦截规则,拦截controller下的所有方法
     */
    @Pointcut("execution(public * com.wawa.system.consumer.*ms.*Controller.*(..))")
    public void sysLogAspect() {
    }

2.第二种是自定义注解的表达式

	/**
     * 自定义一个注解类。把注解放到你需要切的方法上
     */
    @Pointcut("@annotation(com.wawa.system.annotation.NoLogger)")
    public void noLogAspect() {
    }

3.第三种是条件表达式

    @Pointcut("execution(public * com.wawa.system.consumer.*ms.*Controller.*(..))")
    public void sysLogAspect() {
    }

    @Pointcut("@annotation(com.wawa.system.annotation.NoLogger)")
    public void noLogAspect() {
    }
    
	/**
     * 把上面两种表达式作为条件,
     * 其意思就是切所有controller并且排除被@NoLogger所注解的方法
     */
    @Pointcut("sysLogAspect()&&!noLogAspect()")
    public void logAspect() {
    }

下面的片段是几个通知的实例

	/**
     * 拦截控制层的操作日志
     * @param joinPoint
     * @return
     * @throws Throwable
     */
    @Before(value = "logAspect()")
    public void recordLog(JoinPoint joinPoint) throws Throwable {
        SystemLog sysLog = new SystemLog();
        // 将当前实体保存到threadLocal
        sysLogThreadLocal.set(sysLog);
        // 开始时间
        HttpServletRequest request = RequestHolder.getHttpServletRequest();
        // 获取user-agent信息
        String agent = request.getHeader("user-agent");
        // 解析agent字符串
        UserAgent userAgent = UserAgentUtil.parse(agent);
        HashMap<String, Object> map = Maps.newHashMap();
        map.put("userAgent", agent);
        // 获取浏览器对象
        map.put("browser", userAgent.getBrowser().toString());
        map.put("engine", userAgent.getEngine().toString());
        //获取操作系统对象信息
        map.put("os", userAgent.getOs().toString());
        // 获取平台信息
        map.put("platform", userAgent.getPlatform().toString());
        map.put("isMobile", userAgent.isMobile());
        LocalDateTime now = LocalDateTime.now();
        sysLog.setStartTime(now)
                .setClientIp(getIpAddr(request))
                .setUserName("system")
                .setUserAgent(JSONUtil.toJsonStr(map))
                .setCreatedBy("system")
                .setUpdatedBy("system")
                .setUpdatedTime(now)
                .setCreatedTime(now);
        LogUtil.getControllerMethodDescription(joinPoint, sysLog);
    }

	/**
     * 返回通知
     *
     * @param response
     * @throws Throwable
     */
    @AfterReturning(returning = "response", pointcut = "logAspect()")
    public void doAfterReturning(Object response) {
        try {
            //得到当前线程的log对象
            SystemLog sysLog = sysLogThreadLocal.get();
            LocalDateTime startTime = sysLog.getStartTime();
            long end = System.currentTimeMillis();
            long start = startTime.toInstant(ZoneOffset.of("+8")).toEpochMilli();
            sysLog.setExpendTime(end - start)
                    .setEndTime(LocalDateTime.now());
            // 发布事件
            applicationContext.publishEvent(new MyApplicationEvent(sysLog));
            //移除当前log实体
            sysLogThreadLocal.remove();
        } catch (Exception e) {
            log.info("返回参数:" + response + " ===》 解析参数错误");
        }
    }

    /**
     * 异常通知
     *
     * @param e
     */
    @AfterThrowing(pointcut = "logAspect()", throwing = "e")
    public void doAfterThrowable(Throwable e) {
        SystemLog sysLog = sysLogThreadLocal.get();
        // 异常信息
        sysLog.setErrorMsg(LogUtil.getStackTrace(e));
        // 发布事件
        applicationContext.publishEvent(new MyApplicationEvent(sysLog));
        //移除当前log实体
        sysLogThreadLocal.remove();
    }


http://www.kler.cn/a/386094.html

相关文章:

  • 高级java每日一道面试题-2025年01月23日-数据库篇-主键与索引有什么区别 ?
  • kafka-保姆级配置说明(consumer)
  • Flink (十二) :Table API SQL (一) 概览
  • Electron学习笔记,安装环境(1)
  • OpenAI的工具革命: 当Operator撕开中国AI「内卷式创新」的遮羞布
  • 【算法】快速排序1
  • 【自然语言处理与大模型】大模型(LLM)基础知识②
  • Linux基础学习笔记
  • MySQL库操作
  • MAC 安装 brew及其常用命令
  • 十七:Spring Boot (2)-- spring-boot-starter-web 依赖详解
  • 论文略读:GRAG:GraphRetrieval-Augmented Generation
  • Windows10 上安装 Docker 失败
  • 苍穹外卖day09超出配送范围前端不提示问题
  • el-scrollbar 动态更新内容 鼠标滚轮无效
  • Linux(CentOS)设置防火墙开放8080端口,运行jar包,接收请求
  • PHP实现身份证OCR识别API接口
  • Spring Boot环境下的知识分类与检索
  • Qt 软键盘设计
  • CSS 中三角形的绘制方法详解
  • 深度学习:解密图像、音频和视频数据的“理解”之道20241105
  • 2024年11月8日Github流行趋势
  • learnopencv系列二:U2-Net/IS-Net图像分割(背景减除)算法、使用背景减除实现视频转ppt应用
  • Ubuntu24安装MySQL
  • 停水的英文表达柯桥学外语到哪里?生活日常口语培训
  • 三维测量与建模笔记 - 3.1 相机标定基本概念