【Spring】AOP进阶-JoinPoint和ProceedingJoinPoint详解 文章目录*1. 前言* 2. JoinPoint简介* 3. 获取被增强方法的相关信息* 4. ProceedingJoinPoint简介* 5. 获取环绕通知方法的相关信息* 6. 总结1. 前言------在Spring AOP中JoinPoint和ProceedingJoinPoint都是关键的接口用于在切面中获取方法的相关信息以及控制方法的执行。它们的主要区别在于它们在AOP通知中的使用方式和功能。2. JoinPoint简介--------------- Joinpoint是面向切面编程AOP中的一个重要概念指的是在应用程序执行过程中可以被拦截的特定点。在AOP中Joinpoint代表了程序执行的某个具体位置比如方法的调用、异常的抛出等。AOP框架通过拦截这些Joinpoint来插入额外的逻辑实现横切关注点的功能。我们可以通过JoinPoint获取到除了异常参数对象和返回值之外的所有信息示例:可以看到JoinPoint有很多方法.我们可以使用断点调试来看这些方法是干什么用的. 在方法的参数中添加JoinPoint参数打上断点,进行调试,可以看到JoinPoint相关参数在这里可以调试相应的方法例如:当然如果觉得麻烦,也可以直接写代码进行调试,如:JoinPoint相应的方法都可以通过这种方式来调试.由于篇幅原因这里就不过多演示了3. 获取被增强方法的相关信息----------------常用方法如下:1. 获取方法调用时,传入的参数 Object[] args joinPoint.getArgs(); 2. 获取被通知的目标对象 Object target joinPoint.getTarget(); 3. 获取代理方法的信息 MethodSignature signature (MethodSignature) joinPoint.getSignature(); // 获取代理方法的信息 String methodName signature.getName(); // 获取方法名 Class? returnType signature.getReturnType(); // 获取返回类型 Class?[] parameterTypes signature.getParameterTypes(); // 获取参数类型数组 在这个示例中我们首先使用joinPoint.getSignature() 方法获取代理方法的信息然后将其转换为MethodSignature类型的对象。接着我们可以通过MethodSignature对象的方法获取方法名、返回类型、参数类型等信息用于在通知中进行处理。4. 获取增强方法中返回值 AfterReturning(value “point()”,returning “ret”) public void methodAfterReturning(JoinPoint joinPoint, Object ret){ System.out.println(“AfterReturning”); } 5. 获取增强方法中的异常对象 AfterThrowing(value “point()”,throwing “e”) public void methodAfterThrowing(JoinPoint joinPoint,Throwable e){ System.out.println(“AfterThrowing”); } 注意注解中的写法,加了一些参数,同时要将目标方法赋值给value,此外获取增强方法中的返回值,并不一定是要Object类型的,可根据需求自行调整总的来说Joinpoint代表了AOP中能够被拦截的程序执行点通过拦截这些Joinpoint来实现横切关注点的功能。在Spring的AOP中理解和使用Joinpoint是非常重要的。以上的JoinPoint都是用在添加Before,AfterReturning,After,AfterThrowing这四个注解的方法上的,而环绕通知则不同,使用的是ProceedingJoinPoint4. ProceedingJoinPoint简介------------------------- 在Spring AOP中ProceedingJoinPoint是JoinPoint的子接口它专门用于环绕通知Around advice。ProceedingJoinPoint包含了被通知方法的执行信息同时可以访问被通知方法的信息和参数。可以通过使用ProceedingJoinPoint接口来实现更加灵活和精细的环绕通知逻辑。5. 获取环绕通知方法的相关信息-----------------ProceedingJoinPoint接口提供了以下常用方法1. proceed()这是ProceedingJoinPoint接口中最重要的方法。在环绕通知中调用proceed()方法会继续执行被通知的方法。如果环绕通知中不调用proceed()方法被通知的方法将不会执行。 Around(“execution(* com.example.service..(…))”) public Object aroundMethod(ProceedingJoinPoint joinPoint) throws Throwable { // 执行前置逻辑 Object result joinPoint.proceed(); // 继续执行被通知的方法 // 执行后置逻辑 return result; } 注意joinPoint.proceed()方法是可能有返回值的,返回值类型可能有很多,可以直接设置为Object类型2. getArgs()获取被通知方法的参数数组。 Object[] args joinPoint.getArgs(); 3. getTarget()获取被通知的目标对象。 Object target joinPoint.getTarget(); ProceedingJoinPoint接口的主要作用是在环绕通知中控制被通知方法的执行同时可以访问被通知方法的信息和参数。开发人员可以通过使用ProceedingJoinPoint接口来实现更加灵活和精细的环绕通知逻辑。6. 总结------JoinPoint用于获取方法的信息而ProceedingJoinPoint除了能获取方法的信息外还可以控制方法的执行这使得它在环绕通知中非常有用。在AOP的实践中开发人员需要理解这两个接口的使用方式并根据具体的需求选择合适的接口来实现横切关注点的功能。