SpringAOP的JoinPoint类、Proceedingjoinpoint 类详解,AOP环绕通知获取注解信息

这篇具有很好参考价值的文章主要介绍了SpringAOP的JoinPoint类、Proceedingjoinpoint 类详解,AOP环绕通知获取注解信息。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、JoinPoint类、Proceedingjoinpoint 类

1、在使用springboot写AOP的时候,有个JoinPoint类,用来获取代理类和被代理类的信息。

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

# 返回目标对象,即被代理的对象
Object getTarget();

# 返回切入点的参数
Object[] getArgs();

# 返回切入点的Signature
Signature getSignature();

# 返回切入的类型,比如method-call,field-get等等,感觉不重要 
 String getKind();

2、Proceedingjoinpoint 继承了 JoinPoint。是在JoinPoint的基础上暴露出 proceed 这个方法。

环绕通知 = 前置 + 目标方法执行 + 后置通知,proceed方法就是用于启动目标方法的执行。暴露出这个方法,就能支持 aop:around 这种切面。

Proceedingjoinpoint 仅支持环绕通知@Around,而其他的几种切面只需要用到JoinPoint,这也是环绕通知和前置、后置通知方法的一个最大区别。这跟切面类型有关

注意:
joinpoint.getSignature():获取被增强的方法相关信息。
将joinpoint.getSignature拿到的对象强转成MethodSignature这个实现类之后,里面的getReturnType()方法可以用来拿目标方法返回值类型。

@Before("customerJoinPointerExpression()")
public void beforeMethod(JoinPoint joinPoint){
    // 前置通知
	joinPoint.getSignature().getName(); // 获取目标方法名
	joinPoint.getSignature().getDeclaringType().getSimpleName(); // 获取目标方法所属类的简单类名
	joinPoint.getSignature().getDeclaringTypeName(); // 获取目标方法所属类的类名
	joinPoint.getSignature().getModifiers(); // 获取目标方法声明类型(public、private、protected)
	Object[] args = joinPoint.getArgs(); // 获取传入目标方法的参数,返回一个数组
	joinPoint.getTarget(); // 获取被代理的对象
	joinPoint.getThis(); // 获取代理对象自己
}
  // 匹配方法执行连接点方式
    @Around(value = "execution(* *..SomeserviceImpl.Dofirst(..))")
    public Object myAspectJ(ProceedingJoinPoint point) throws Throwable {
      
         //拦截的实体类
        Object target = point.getTarget();
        //拦截的方法名称
        String methodName = point.getSignature().getName();
        //拦截的方法参数
        Object[] args = point.getArgs();
        //拦截的放参数类型
        Class[] parameterTypes = ((MethodSignature)point.getSignature()).getMethod().getParameterTypes();

        object = point.proceed(); //目标方法的执行
        return null;
    }

二、AOP环绕通知获取注解信息

1、概念

注解(Annotation)是撰写在原始码中的资讯,可以提供代码以外的额外资讯,本身有其结构,你可以使用工具提取这些结构化讯息。
简单来说注解就是写在程序上方的结构化注释,java会按照其结构读取讯息,并且做对应操作。
比如@Override注解标注在方法上,在编译期间,java就会检查当前方法是否重载了父类的方法,如果没有就报错。

java自带标准注解
@Override:表示当前的方法定义将覆盖父类中的方法;
@Deprecated:表示代码被弃用,如果使用了被@Deprecated注解的代码则编译器将发出警告;
@SuppressWarnings:表示关闭编译器警告信息。

利用上述注解生成自己定义的注解,就像自己定义一个类一样,可以通过@interface创建一个自定义注解。

[@Target]     //限定注解可以标注的位置:ANNOTATION_TYPE、CONSTRUCTOR 、FIELD 、LOCAL_VARIABLE 、METHOD 、PACKAGE 、PARAMETER 、TYPE
[@Retention]  //说明了这个注解的存活时间	:SOURCE,CLASS ,RUNTIME
[@Documented] // 将注解中的元素包含到 Javadoc 中去	
[@Inherited]  //子类自动拥有父类的注解	
public @interface [名称] {
     // 元素
     String value() default "hello";
}

【@Retention】
RetentionPolicy.SOURCE :注解只在源码阶段保留,在编译器进行编译时它将被丢弃忽视;
RetentionPolicy.CLASS :注解只被保留到编译进行的时候,它并不会被加载到 JVM 中;
RetentionPolicy.RUNTIME :注解可以保留到程序运行的时候,它会被加载进入到 JVM 中,所以在程序运行时可以获取到注解

2、代码示例

注解:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface AopCache 
{
    /**
     * 每个方法唯一的key
     */
    String key();
}

切面类:

@Aspect    //标注增强处理类(切面类)
@Component //交由Spring容器管理
@Order(0)  //设置优先级,值越低优先级越高
public class MyaspectJ {

    //定义增强,pointcut连接点使用@annotation(xxx)进行定义
    @Pointcut(value = "@annotation(xx.xx.xx.AopCache)")
    public void methodPointcut(){}

    // 匹配方法执行连接点方式
    @Around("methodPointcut()")
    public Object myAspectJ(ProceedingJoinPoint point) throws Throwable {
    
        // 获取方法上的注解
        MethodSignature methodSignature = (MethodSignature) point.getSignature();
        Method method = methodSignature.getMethod();
        AopCache annotation = method.getAnnotation(AopCache.class);
        //获取key
        String key = annotation.key();

        object = point.proceed();   // 1. 目标方法的调用
        return null;
    }
}

方法使用这个注解,则会直接走切面增强文章来源地址https://www.toymoban.com/news/detail-596853.html

@AopCache(key = "自定义key值")
public String getAllType(){

   return "";
}

到了这里,关于SpringAOP的JoinPoint类、Proceedingjoinpoint 类详解,AOP环绕通知获取注解信息的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spring之Aop切面---日志收集(环绕处理、前置处理方式)--使用/教程/实例

    本文章介绍采用两种不同方式处理----系统登录、系统退出登录两种场景日志。 环绕处理系统登录日志 前置处理系统退出登录日志 系统登录日志类LoginLogEntity .java 1、自定义注解类LoginLogAop.class 2、切面处理类LogoutLogAspect.java 1、自定义注解类LogoutLogAop.class 2、切面处理类Logout

    2024年02月13日
    浏览(40)
  • 【Spring教程16】Spring框架实战:详解解读AOP配置管理中AOP切入点表达式和通知类型

    欢迎大家回到《 Java教程之Spring30天快速入门》,本教程所有示例均基于Maven实现,如果您对Maven还很陌生,请移步本人的博文《 如何在windows11下安装Maven并配置以及 IDEA配置Maven环境》,本文的上一篇为《 AOP的工作流程和AOP的核心概念》 前面的案例中,有涉及到如下内容: 对于

    2024年02月04日
    浏览(40)
  • 【Spring AOP学习】AOP的组成 && SpringAOP的实现和实现原理

    目录 一、认识SpringAOP 1、AOP是什么? 2、AOP的功能 3、AOP的组成(重要) 二、SpringAOP的实现 🌷1、添加Spring AOP框架支持 🌷2、定义切面和切点 🌷 3、定义通知 3.1 完成代码实现 3.2 具体通知分析 🌷4、小练习:使用AOP统计UserController每个方法的执行时间。  三、SpringAOP的实现

    2024年02月15日
    浏览(32)
  • 007 spring aop(通知)(xml)

    2024年04月16日
    浏览(29)
  • javaee spring aop 的五种通知方式

    2024年02月10日
    浏览(43)
  • SpringAOP(图文详解)

    AOP 又名 Aspect Oriented Programming 意为 ‘面向切面编程’通过预编译和运行期间动态代理来实现程序功能的统一维护的一种技术。 AOP 思想是OOP(面向对象)的延续 在 OOP 中, 我们以类(class)作为我们的基本单元, 而 AOP 中的基本单元是 Aspect(切面), AOP 是软件行业的热点,也是Spring框

    2024年02月10日
    浏览(27)
  • SpringAOP详解

    目录 前言: 相关概念 切点表达式规则 代码演示 SpringAOP实现原理 织入(代理的生成时机) JDK和CGLIB区别 小结:     AOP(Aspect Oriented Programming)是思想(面向切面编程),对某一类事情的统一处理。Spring AOP是思想的具体实现框架。 1)切面(类)     某一方面的具体内容处

    2024年02月09日
    浏览(26)
  • FreeRTOS-任务通知详解

    ✅作者简介:嵌入式入坑者,与大家一起加油,希望文章能够帮助各位!!!! 📃个人主页: @rivencode的个人主页 🔥系列专栏: 玩转FreeRTOS 💬保持学习、保持热爱、认真分享、一起进步!!! FreeRTOS越学越简单,前面已经把真实的队列、信号量、事件组全部学完,现在学

    2024年02月06日
    浏览(36)
  • Spring——AOP(图文详解)

    AOP 又名 Aspect Oriented Programming 意为 ‘面向切面编程’通过预编译和运行期间动态代理来实现程序功能的统一维护的一种技术。 AOP 思想是OOP(面向对象)的延续 在 OOP 中, 我们以类(class)作为我们的基本单元, 而 AOP 中的基本单元是 Aspect(切面), AOP 是软件行业的热点,也是Spring框

    2024年02月11日
    浏览(34)
  • spring 详解六 AOP

    AOP,Aspect Oriented Programming,面向切面编程 ,是对面向对象编程OOP的升华,OOP是纵向对事物的抽象,一个对象包含属性信息和动态的方法信息等,而AOP是横向对不同事物的抽象,属性与属性、方法与方法、对象与对象都可以组成一个切面,而这种思想叫做界面编程 名称     

    2024年02月15日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包