概念

Joint Point

JointPoint是程序运行过程中可识别的点,这个点可以用来作为AOP切入点。JointPoint对象则包含了和切入相关的很多信息。比如切入点的对象,方法,属性等。我们可以通过反射的方式获取这些点的状态和信息,用于追踪tracing和记录logging应用信息。

Pointcut

pointcut 是一种程序结构和规则,它用于选取join point并收集这些point的上下文信息。
pointcut通常包含了一系列的Joint Point,我们可以通过pointcut来同时操作jointpoint。单从概念上,可以把Pointcut当做jointpoint的集合。

JointPoint和ProceedingJoinPoint区别
JoinPoint
joinpoint的方法如下

# 返回目标对象,即被代理的对象
Object getTarget();# 返回切入点的参数
Object[] getArgs();# 返回切入点的Signature
Signature getSignature();# 返回切入的类型,比如method-call,field-get等等,不重要String getKind();

ProceedingJoinPoint
Proceedingjoinpoint 继承了 JoinPoint。是在JoinPoint的基础上暴露出 proceed 这个方法。proceed很重要,这个是aop代理链执行的方法。

public interface ProceedingJoinPoint extends JoinPoint {void set$AroundClosure(AroundClosure var1);default void stack$AroundClosure(AroundClosure arc) {throw new UnsupportedOperationException();}Object proceed() throws Throwable;Object proceed(Object[] var1) throws Throwable;
}

ProceedingJoinPoint只能用在around(环绕通知)中
环绕通知=前置+目标方法执行+后置通知,proceed方法就是用于启动目标方法执行的

joinPoint使用方法如下

     //1.获取切入点所在的目标对象Object obj = joinPoint.getTarget();  //2.获取修饰符+ 包名+组件名(类名) +方法名Signature signature = joinPoint.getSignature();//3.获取方法上的注解MethodSignature methodSignature = (MethodSignature) signature;Method method = methodSignature.getMethod();if (method != null){xxxxxx annoObj= method.getAnnotation(xxxxxx.class);}return null;//4.获取切入点方法上的参数列表Object[] args = joinPoint.getArgs();

使用案例,环绕通知
1.定义一个注解 模拟记录日志

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface CustomLog {String title() default "";
}

2.定一个切面

@Aspect
@Component
@Slf4j
public class CustomAspect {/*** 定义切入点*/@Pointcut("@annotation(io.renren.common.annotation.CustomLog)")public void CusjoinPoint() {}/*** 环绕通知* @param joinPoint* @return* @throws Throwable*/@Around("CusjoinPoint()")public Object around(ProceedingJoinPoint joinPoint) throws Throwable {Object proceed = joinPoint.proceed();log(joinPoint);return proceed;}/*** 简单打印日志--* @param joinPoint*/private void log(ProceedingJoinPoint joinPoint) {Signature signature = joinPoint.getSignature();MethodSignature methodSignature = (MethodSignature) signature;Method method = methodSignature.getMethod();String methodName = method.getName();CustomLog customLog = method.getDeclaredAnnotation(CustomLog.class);String title = customLog.title();log.info("methodName =>{},title=>>>>{}",methodName,title);}
}

3.把注解打到接口上面,然后调用该接口可以看到打印的日志

AspectJ中JoinPoint和ProceedingJoinPoint注解的使用相关推荐

  1. AspectJ 切面注解中五种通知注解:@Before、@After、@AfterRunning、@AfterThrowing、@Around

    要在 Spring 中声明 AspectJ 切面, 只需要在 IOC 容器中将切面声明为 Bean 实例. 当在 Spring IOC 容器中初始化 AspectJ 切面之后, Spring IOC ...

  2. AspectJ中的JoinPoint方法概要

    AspectJ中的切入点匹配的执行点称作连接的(Join Point),在通知方法中可以声明一个JoinPoint类型的参数.通过JoinPoint可以访问连接点的细节.下面简要介绍JponPoint ...

  3. AspectJ中的org.aspectj.lang.JoinPoint接口的主要方法及使用

    AspectJ 使用 org.aspectj.lang.JoinPoint 接口表示目标类连接点对象,如果是环绕增强,则使用 org.aspectj.lang.ProceedingJoinPoint ...

  4. @AspectJ中的几种通知方式详解

    本文来详细说下@AspectJ中的几种通知方式 文章目录 概述 通知方式说明 一个例子 本文小结 概述 当Spring 2.0发布以后,Spring AOP增加了新的使用方式,Spring AOP集成 ...

  5. SpringAOP——JoinPoint 和 ProceedingJoinPoint

    AOP 的几个概念 名称 解释 Pointcut 切点,决定处理如权限校验.日志记录等在何处切入业务代码中(即织入切面).切点分为execution方式和annotation方式.前者可以用路径表达式 ...

  6. SpringBoot AOP中JoinPoint的用法和通知切点表达式

    前言 上一篇文章讲解了springboot aop 初步完整的使用和整合 这一篇讲解他的接口方法和类 JoinPoint和ProceedingJoinPoint对象 JoinPoint对象封装了Spr ...

  7. JoinPoint和ProceedingJoinPoint区别

    本文主要介绍JoinPoint的常用方法 原文链接:JoinPoint和ProceedingJoinPoint有啥不一样? 在以一个实际例子演示如何使用注解实现AOP装配时,为了监控应用程序的性能,我 ...

  8. Spring中的一些常用注解

    目录 1. @Autowired 2. @Qualifier 3. @Resource 4. @Component 5. @Value 6. @Bean 7. 声明bean的几个注解 7.1 @Ser ...

  9. NoClassDefFoundError: org/aspectj/lang/JoinPoint

    NoClassDefFoundError: org/aspectj/lang/JoinPoint 控制台输出: org.springframework.beans.factory.BeanCreati ...

最新文章

  1. USB学习笔记连载(八):FX2替换到FX2LP需要注意事项
  2. ZooKeeper实战(三):ZooKeeper实现分布式配置中心、分布式锁、Reactive响应式模型
  3. java串口发送16进制数据_MFC串口通信发送16进制数据的方法
  4. python运行结果闪退_Pyhton TestCase运行闪退与失败,原因不详。。。
  5. 用成交量判断股价走势是否正常
  6. Haproxy负载均衡详解,与keepalived的搭配
  7. dynamic image
  8. a标签增加onclick事件提示未定义function
  9. Win11系统pin码忘记了怎么办?Win11忘记pin码解决方法
  10. Win10开启卓越性能模式
  11. java io 操作实例
  12. 住城中村的散装女主播
  13. linkerd 本地环境安装
  14. html5加载更多,HTML5[7]: 实现网页版的加载更多
  15. 关于qq邮箱 该文件已达到200次的下载限制,您已不能下载该文件 的问题处理
  16. 向数据库中批量插入数据的sql 语句
  17. 记录一些最近用过的编码转换
  18. java I/O流:字节流和字符流(概要及其方法)
  19. javascript全国省市级连
  20. PowerPMAC技术培训------5、虚拟电机配置

热门文章

  1. 斗转星移——面向对象(一)
  2. 小米海康威视 暑期实习前端面试
  3. Web端测试六大类型
  4. WebFlux学习总结
  5. Java基础:8种基本数据类型,取值范围和储存字节说明。
  6. 宝塔中查看mysql默认密码
  7. 什么是mvc和mvvm?以及mvc和mvvm的区别
  8. RemoteApp 实现分析
  9. 佛言禅语-----生命的智慧
  10. Jenkins插件--Cppcheck Plugin