首页 > 其他分享 >浅析AOP中的JoinPoint的使用

浅析AOP中的JoinPoint的使用

时间:2024-05-29 15:02:31浏览次数:13  
标签:joinPoint 连接点 对象 JoinPoint 获取 AOP 方法 浅析

JoinPoint可以让我们获取到哪些信息

JoinPoint接口提供了多个方法,允许我们在切面中获取与连接点(即目标方法执行点)相关的信息。以下是一些常用的方法,以及它们能够提供的信息:

  1. getArgs(): 获取目标方法的参数列表。这些参数是在方法调用时传递给方法的实际参数。
  2. getSignature(): 获取方法的签名(Signature对象)。通过这个对象,你可以获取方法的名字、返回类型、方法所在的类等信息。
  3. getTarget(): 获取目标对象,即被代理的对象。
  4. getThis(): 获取AOP代理对象,即代理目标对象的代理对象。
  5. toString(): 返回连接点的字符串表示形式,通常包含了方法的全名和其他相关信息。
  6. toShortString(): 返回连接点的简短字符串表示形式,通常只包含方法名。
  7. getSourceLocation(): 获取连接点对应的方法在源代码中的位置,如行号。
  8. getKind(): 获取连接点的类型,例如方法执行(method-execution)或方法调用(method-call)。
  9. getStaticPart(): 获取连接点的静态部分,即与特定连接点关联的代码本身的描述。
    通过这些方法,你可以在切面中访问到目标方法的详细信息,从而可以根据这些信息执行不同的逻辑,如日志记录、权限校验等。

下面是一个使用JoinPoint的示例,展示了如何在切面中获取连接点信息:

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class InfoAspect {
    @Before("execution(* com.example.service.*.*(..))")
    public void beforeMethod(JoinPoint joinPoint) {
        // 获取方法签名
        String methodName = joinPoint.getSignature().toShortString();
        System.out.println("方法名: " + methodName);
        
        // 获取目标对象
        Object target = joinPoint.getTarget();
        System.out.println("目标对象: " + target.getClass().getSimpleName());
        
        // 获取方法参数
        Object[] args = joinPoint.getArgs();
        System.out.println("方法参数: " + Arrays.toString(args));
        
        // 获取代理对象
        Object thisObject = joinPoint.getThis();
        System.out.println("代理对象: " + thisObject.getClass().getSimpleName());
        
        // 获取连接点类型
        String kind = joinPoint.getKind();
        System.out.println("连接点类型: " + kind);
        
        // 获取源代码位置(如果可用)
        SourceLocation sourceLocation = joinPoint.getSourceLocation();
        System.out.println("源代码位置: " + sourceLocation);
        
        // 输出连接点的详细信息
        System.out.println("连接点详细信息: " + joinPoint.toString());
    }
}

在这个示例中,我们定义了一个切面InfoAspect,它有一个@Before通知,该通知会在执行com.example.service包下所有方法之前触发。在beforeMethod方法中,我们通过JoinPoint参数获取了方法名、目标对象、方法参数、代理对象、连接点类型和源代码位置等信息,并将它们打印出来。
当这个切面的通知被触发时,你会在控制台看到类似以下的信息输出:

方法名: UserService.save(..)
目标对象: UserService
方法参数: [Ljava.lang.Object;@12345678
代理对象: UserService$$EnhancerBySpringCGLIB$$12345678
连接点类型: method-execution
源代码位置: SourceLocation[...]
连接点详细信息: execution(UserService.save(User))

JoinPoint和ProceedingJoinPoint的区别

JoinPoint

  • JoinPoint接口代表了程序运行过程中的一个特定点,例如方法的执行。在AOP术语中,这个点被称为“连接点”。
  • JoinPoint提供了获取代理方法的相关信息的方法,例如方法名称、参数、目标对象等。
  • JoinPoint通常用于@Before、@After和@AfterReturning等通知中,因为这些通知并不需要控制目标方法的执行。
    ProceedingJoinPoint
  • ProceedingJoinPointJoinPoint的子接口,专门用于环绕通知(@Around)。
  • ProceedingJoinPoint除了拥有JoinPoint的所有功能外,还提供了一个proceed()方法,这个方法用于控制目标方法的执行。调用proceed()方法,会触发目标方法的执行。
  • proceed()方法可以传入参数,这些参数将会传递给目标方法。这使得环绕通知可以在目标方法执行前后执行自己的逻辑,并且可以修改传入目标方法的参数和返回值。

标签:joinPoint,连接点,对象,JoinPoint,获取,AOP,方法,浅析
From: https://blog.csdn.net/qq_39354140/article/details/139273841

相关文章

  • 详解 Java AOP:面向方面编程的核心概念与 Spring 实现
    ......
  • 浅析SpringBoot中的AOP以及自定义注解类
    概念说明SpringBoot中的AOP(面向切面编程)是一种编程范式,它允许开发者定义跨多个对象的横切关注点。横切关注点是与业务逻辑无关的功能,如日志记录、安全检查、事务管理等。AOP的主要目的是将横切关注点与业务逻辑分离,提高代码的模块化和可维护性。AOP的核心概念包括:切面(As......
  • Java EE-Spring AOP 面向切面编程
    SpringAOPhttps://www.cnblogs.com/joy99/p/10941543.html超级详细版:Chapter 6. 使用Spring进行面向切面编程(AOP)AOP原理面向切面(AspectOrientProgramming)面向切面编程,是面向对象编程(OOP)的一种补充。在Java程序自上而下处理主业务时,也会经常处理一些和主......
  • 浅析MySQL 8.0直方图原理
    本文分享自华为云社区《【MySQL技术专栏】MySQL8.0直方图介绍》,作者:GaussDB数据库。背景数据库查询优化器负责将SQL查询转换为尽可能高效的执行计划,但因为数据环境不断变化导致优化器对查询数据了解的不够充足,可能无法生成最优的执行计划进而影响查询效率,因此MySQL8.0推出了直......
  • 纸质名片变成结构化数据:浅析OCR名片识别技术的原理与应用
    OCR名片识别技术,如同一位高效的文字翻译官,巧妙地将名片上的文字信息翻译成可编辑、结构化的电子数据。它凭借光学字符识别的智慧,历经图像采集、文字提取、识别算法、结果结构化及人工智能技术的融合等精妙步骤,实现了对名片文字的自动化解码与转化。首先,图像采集作为OCR名片识......
  • 【Spring】AOP简介_工作原理_代理模式-静态代理
    1、简介Spring的AOP(AspectOrientedProgramming,面向切面编程)是Spring框架的一个重要部分,它是对OOP(ObjectOrientedProgramming,面向对象编程)的一种补充。在面向对象编程中,我们主要关注的是对象以及它们之间的关系,但在实际开发中,我们还会遇到一些与业务逻辑无关但又需要统一处......
  • AoPS - Chapter 19 Probability
    本章介绍了一些概率的基本概念与条件概率。独立与互斥Twoeventsarecalleduncorrelated(orindependent)(独立)iftheyhavenobearingoneachother.\[P(A\capB)=P(A)\timesP(B)\]Twoeventsarecalledmutuallyexclusive(互斥)ifbotheventscannotsimultaneou......
  • Java利用Aop切面记录操作日志(注解方式)
    前提需求之前收到一个新需求,要求对已有的系统上新增一个记录操作日志的功能,对于这类功能大家应该也看的很多了,必然是AOP进行解决,方便快捷,就是需要一个个方法加注释比较麻烦,说到AOP,就先粗略的介绍下AOPAOP的概念1.1什么是AOP?AOP(AspectOrientedProgramming):⾯向切⾯编程......
  • H5 缓存机制浅析 移动端 Web 加载性能优化
     H5缓存机制浅析移动端Web加载性能优化 转自:https://www.cnblogs.com/bugly/p/5039153.html1H5缓存机制介绍H5,即HTML5,是新一代的HTML标准,加入很多新的特性。离线存储(也可称为缓存机制)是其中一个非常重要的特性。H5引入的离线存储,这意味着web应用可......
  • AoPS - Chapter 24.5 The Pell Equation
    \[\Large{施工未完成,日后会补上。}\]本来这篇应该包含在Chapter24中,但是篇幅太长故单独分离出来。ThePellEquation重量级人物登场。关于\(x,y\)的形如\(x^2-Dy^2=\pm1\)的方程称为佩尔方程(Pellequation)。其中\(D\)是正整数,不是完全平方数。求解凑出一组特......