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

Java后端之AOP

AOP:面向切面编程,本质是面向特定方法编程

  • 引入依赖:
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>

示例:记录方法运行耗时

package com.diaryback.aop;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

@Slf4j
@Component
@Aspect //声明AOP类
public class TimeAspect {

    @Around("execution(* com.diaryback.controller.*.*(..))") //切入点表达式
    public Object recordTime(ProceedingJoinPoint joinPoint) throws Throwable {
        //记录开始时间
        long begin = System.currentTimeMillis();

        //调用目标方法
        Object result = joinPoint.proceed();

        //记录结束时间
        long end = System.currentTimeMillis();
        log.info(joinPoint.getSignature() + "方法执行耗时:{}ms", end - begin);

        return result;
    }
}

连接点JoinPoint:可以被AOP控制的方法(暗含方法执行时的信息)
通知Advice:共性的功能,最终被提取为一个方法
切入点PointCut:匹配连接点的条件,通知仅会在切入点方法执行时被调用。通常用切入点表达式来描述
切面Aspect:通知+切入点
目标对象Target:通知所应用的对象

环绕通知

在这里插入图片描述
环绕通知必须调用参数jointPoint.proceed()让原始方法执行,且必须指定返回值为Object来接收原始方法的返回值

在这里插入图片描述

通知顺序

当多个切面类匹配到同一个目标方法时都会执行,before通知类名排名越靠前的先执行,after通知类名排名越靠后越先执行
可以用@Order注解控制执行顺序。before方法数字小的先执行,after方法数字小的后执行

切入点表达式

  • execution
execution(访问修饰符? 返回值 包名.类名.?方法名(方法参数) throws 异常?)

通配符:*可以通配任意返回值,包名,,方法名,任意类型参数,也可以通配包、类、方法名的一部分
..:可以匹配任意层级的包或任意类型任意个数的参数
可以使用&& || !组合比较复杂的切入点表达式

  • annotation
    用于匹配标识有特定注解的方法
    在这里插入图片描述

连接点

  • 对于Around通知,获取连接点信息只能用ProceedingJoinPoint
  • 对于其他四种通知获取连接点信息只能用JoinPoint,是ProceedingJoinPoint的父类型
        //获取目标对象的类名
        String className = joinPoint.getTarget().getClass().getName();
        log.info("className: {}", className);

        //获取目标对象的方法名
        String methodName = joinPoint.getSignature().getName();
        log.info("methodName: {}", methodName);

        //获取目标对象的参数
        Object[] args = joinPoint.getArgs();
        log.info("args: {}", Arrays.toString(args));

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

相关文章:

  • 深入 Rollup:从入门到精通(三)Rollup CLI命令行实战
  • linux设置mysql远程连接
  • GPT 本地运行输出界面简洁美观(命令行、界面、网页)
  • 基于Flask的旅游系统的设计与实现
  • jupyter版本所引起的扩展插件问题
  • 数组与链表
  • java知识点 | java中不同数据结构的长度计算
  • Jetson nano 安装 PCL 指南
  • 【PyTorch][chapter 29][李宏毅深度学习]Fine-tuning LLM
  • 【第八天】零基础入门刷题Python-算法篇-数据结构与算法的介绍-一种常见的回溯算法(持续更新)
  • unity. Capsule Collider(胶囊碰撞体)
  • 什么是反向海淘?如何入局反向海淘?
  • 关于圆周率的新认知
  • 寒假学web--day08
  • 第26章 测试驱动开发(TDD)模式详解与 Python 实践
  • K8s运维管理平台 - xkube体验:功能较多
  • [HOT 100] 0015. 三数之和
  • 代码审查中的自动化与AI应用
  • 2025寒假作业
  • C#,入门教程(09)——运算符的基础知识