基于SpringAop中JoinPoint对象的使用说明

 更新时间:2021年06月18日 08:47:23   作者:玩名堂_  
这篇文章主要介绍了基于SpringAop中JoinPoint对象的使用说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

JoinPoint 对象

JoinPoint对象封装了SpringAop中切面方法的信息,在切面方法中添加JoinPoint参数,就可以获取到封装了该方法信息的JoinPoint对象。

常用api:

方法名 功能
Signature getSignature(); 获取封装了署名信息的对象,在该对象中可以获取到目标方法名,所属类的Class等信息
Object[] getArgs(); 获取传入目标方法的参数对象
Object getTarget(); 获取被代理的对象
Object getThis(); 获取代理对象

ProceedingJoinPoint对象

ProceedingJoinPoint对象是JoinPoint的子接口,该对象只用在@Around的切面方法中。

添加了

Object proceed() throws Throwable //执行目标方法
Object proceed(Object[] var1) throws Throwable //传入的新的参数去执行目标方法

两个方法.

Demo

切面类

@Aspect
@Component
public class aopAspect {
    /**
     * 定义一个切入点表达式,用来确定哪些类需要代理
     * execution(* aopdemo.*.*(..))代表aopdemo包下所有类的所有方法都会被代理
     */
    @Pointcut("execution(* aopdemo.*.*(..))")
    public void declareJoinPointerExpression() {}
    /**
     * 前置方法,在目标方法执行前执行
     * @param joinPoint 封装了代理方法信息的对象,若用不到则可以忽略不写
     */
    @Before("declareJoinPointerExpression()")
    public void beforeMethod(JoinPoint joinPoint){
        System.out.println("目标方法名为:" + joinPoint.getSignature().getName());
        System.out.println("目标方法所属类的简单类名:" +        joinPoint.getSignature().getDeclaringType().getSimpleName());
        System.out.println("目标方法所属类的类名:" + joinPoint.getSignature().getDeclaringTypeName());
        System.out.println("目标方法声明类型:" + Modifier.toString(joinPoint.getSignature().getModifiers()));
        //获取传入目标方法的参数
        Object[] args = joinPoint.getArgs();
        for (int i = 0; i < args.length; i++) {
            System.out.println("第" + (i+1) + "个参数为:" + args[i]);
        }
        System.out.println("被代理的对象:" + joinPoint.getTarget());
        System.out.println("代理对象自己:" + joinPoint.getThis());
    }
    /**
     * 环绕方法,可自定义目标方法执行的时机
     * @param pjd JoinPoint的子接口,添加了
     *            Object proceed() throws Throwable 执行目标方法
     *            Object proceed(Object[] var1) throws Throwable 传入的新的参数去执行目标方法
     *            两个方法
     * @return 此方法需要返回值,返回值视为目标方法的返回值
     */
    @Around("declareJoinPointerExpression()")
    public Object aroundMethod(ProceedingJoinPoint pjd){
        Object result = null;
        try {
            //前置通知
            System.out.println("目标方法执行前...");
            //执行目标方法
            //result = pjd.proeed();
            //用新的参数值执行目标方法
            result = pjd.proceed(new Object[]{"newSpring","newAop"});
            //返回通知
            System.out.println("目标方法返回结果后...");
        } catch (Throwable e) {
            //异常通知
            System.out.println("执行目标方法异常后...");
            throw new RuntimeException(e);
        }
        //后置通知
        System.out.println("目标方法执行后...");
        return result;
    }
}

被代理类

/**
 * 被代理对象
 */
@Component
public class TargetClass {
    /**
     * 拼接两个字符串
     */
    public String joint(String str1, String str2) {
        return str1 + "+" + str2;
    }
}

测试类

public class TestAop {
    @Test
    public void testAOP() {
        //1、创建Spring的IOC的容器
        ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:bean.xml");
        //2、从IOC容器中获取bean的实例
        TargetClass targetClass = (TargetClass) ctx.getBean("targetClass");
        //3、使用bean
        String result = targetClass.joint("spring","aop");
        System.out.println("result:" + result);
    }
}

输出结果

目标方法执行前...
目标方法名为:joint
目标方法所属类的简单类名:TargetClass
目标方法所属类的类名:aopdemo.TargetClass
目标方法声明类型:public
第1个参数为:newSpring
第2个参数为:newAop
被代理的对象:aopdemo.TargetClass@4efc180e
代理对象自己:aopdemo.TargetClass@4efc180e
目标方法返回结果后...
目标方法执行后...
result:newSpring+newAop

SpringAop 通知参数JoinPoint的几个常用API

1.获取类名

String className = joinPoint.getSignature().getDeclaringTypeName();

2.获取方法名

String methodName = joinPoint.getSignature().getName();

3.获取返回值类型

MethodSignature methodSignature = (MethodSignature)joinPoint.getSignature();
Class clazz = methodSignature.getReturnType();

如果是环绕通知参数ProceedingJoinPoint则有

4.执行目标方法

joinPoint.proceed();

5.执行目标方法,替换入参

proceed(java.lang.Object[] args)

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • SpringBoot中@Transiactional注解没有效果的解决

    SpringBoot中@Transiactional注解没有效果的解决

    这篇文章主要介绍了SpringBoot中@Transiactional注解没有效果的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • 详解Java8中Optional的常见用法

    详解Java8中Optional的常见用法

    Opitonal是java8引入的一个新类,目的是为了解决空指针异常问题。本文将通过示例为大家详细讲讲Optional的常见用法,需要的可以参考一下
    2022-09-09
  • 深入理解JVM之Java对象的创建、内存布局、访问定位详解

    深入理解JVM之Java对象的创建、内存布局、访问定位详解

    这篇文章主要介绍了深入理解JVM之Java对象的创建、内存布局、访问定位,结合实例形式详细分析了Java对象的创建、内存布局、访问定位相关概念、原理、操作技巧与注意事项,需要的朋友可以参考下
    2019-09-09
  • 501 Command "HELO" requires an argument问题的解决方法

    501 Command "HELO" requires an argument问题的解决方法

    换一个windows服务器,发现就没这样的问题,仅在一台Linux服务器上可以重现,直观感觉就是这台Linux服务器某些配置有问题
    2013-08-08
  • Spring如何使用AOP实现声明式事务管理

    Spring如何使用AOP实现声明式事务管理

    Spring 使用 AOP 实现声明式事务管理是其最强大的功能之一,这篇文章小编将详细拆解这个过程,从高层概念到底层原理,感兴趣的小伙伴可以参考一下
    2025-06-06
  • Java如何获取一个IP段内的所有IP地址

    Java如何获取一个IP段内的所有IP地址

    这篇文章主要为大家详细介绍了Java如何根据起始和结束的IP地址获取IP段内所有IP地址,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-11-11
  • 带大家深入了解Spring事务

    带大家深入了解Spring事务

    Spring框架提供统一的事务抽象,通过统一的编程模型使得应用程序可以很容易地在不同的事务框架之间进行切换. 在学习Spring事务前,我们先对数据库事务进行简单的介绍。,需要的朋友可以参考下
    2021-05-05
  • 浅析Spring Validation参数校验的实现原理与进阶用法

    浅析Spring Validation参数校验的实现原理与进阶用法

    这篇文章主要介绍了Spring Validation参数校验的实现原理与进阶用法,本文展示了分组校验,嵌套校验,集合校验等进阶功能,并提供了自定义校验注解的实现方法,希望对大家有所帮助
    2026-01-01
  • mybatis 新增返回id的实现

    mybatis 新增返回id的实现

    Mybatis插入数据时,可以通过两种方式返回生成的ID,两种方式都需要在实体类中提供userId的getter和setter方法,本文就详细的介绍一下这两种方法,感兴趣的可以了解一下
    2024-09-09
  • SpringBoot开发技巧启动时配置校验实现示例

    SpringBoot开发技巧启动时配置校验实现示例

    这篇文章主要为大家介绍了SpringBoot开发在启动时自动配置校验的实现示例及原理解析,有需要的朋友可以借鉴参考下希望能够有所帮助
    2021-10-10

最新评论