SpringBoot中定位切点的两种常用方法

作者:LukeLong 时间:2023-09-26 08:45:17 

有时候,我们使用AOP来进行放的增强,编写切面类的时候,需要定位在哪个方法上试用该切面进行增强,本片文章主要讲解两种在SpringBoot中定位切点的方法,一种是使用execution表达式的方法,一种则是利用自定义注解的方法。

接下来以一个简单的例子来讲解这两种方法的使用方式。

<==========方法执行前==========>
method();
<==========方法执行后==========>

execution 表达式

execution表达式的方式主要是在定义切点的时候,通过表达式的方式选取到所需要增强的方法。

execution表达式解读


execution(<修饰符模式>?<返回类型模式><方法名模式>(<参数模式>)<异常模式>?)

类型解读是否必须示例
<修饰符模式>表示所选的修饰符类型public/private/...
<返回类型模式>表示所选的返回值类型void/int/...
<方法名模式>表示所选的包或者方法com.luke.service/com.luke.controller.*/...
(<参数模式>)表示所选方法的参数*(..)/*(String name)/*(int size, ..)/...
<异常模式>表示所选方法的异常类型throws Exception/...


// 匹配指定包中的所有方法
execution(* com.luke.service.*(..))

// 匹配当前包中的所有public方法
execution(public * UserService.*(..))

// 匹配指定包中的所有public方法,并且返回值是int类型的方法
execution(public int com.luke.service.*(..))

// 匹配指定包中的所有public方法,并且第一个参数是String,返回值是int类型的方法
execution(public int com.luke.service.*(String name, ..))

自定义切面类:


@Aspect
@Component
public class LogAspect {

@Pointcut("execution(* com.luke.springdata.controller.*.*(..))")
   public void operationLog(){}

/**
    * 这里只定义一个Around的增强做展示
    */
   @Around("operationLog()")
   public Object doAround(ProceedingJoinPoint joinPoint) {
       Object proceed = null;
       try {
           System.out.println("方法执行前");
           proceed = joinPoint.proceed();
           System.out.println("方法执行后");
       } catch (Throwable throwable) {
           throwable.printStackTrace();
       }
       return proceed;
   }
}

此切点的execution表达式为com.luke.springdata.controller包下的所有方法。
使用**@Around**注解表明增强的方法,并且指定切点。

测试用Controller类


@RestController
@RequestMapping("/person")
public class PersonController {

@GetMapping("/test")
   public void test(){
       System.out.println("方法执行了");
   }

}

运行项目,调用该方法,查看结果。

方法执行前
方法执行了
方法执行后

自定义注解的方法

自定义注解的方式就是在需要增强的方法上面加上自定义的注解即可。

自定义注解类:


@Documented
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Log{

}

这里自定义了一个注解Log,该注解只能加在方法上。
自定义切面类:


@Aspect
@Component
public class LogAspect {

@Pointcut("@annotation(com.luke.springdata.annotation.Log)")
   public void operationLog(){}

/**
    * 这里只定义一个Around的增强做展示
    */
   @Around("operationLog()")
   public Object doAround(ProceedingJoinPoint joinPoint) {
       Object proceed = null;
       try {
           System.out.println("方法执行前");
           proceed = joinPoint.proceed();
           System.out.println("方法执行后");
       } catch (Throwable throwable) {
           throwable.printStackTrace();
       }
       return proceed;
   }
}

这里编写的自定义个切面类,用**@Pointcut注解定义一个切面,并且这次采用@annotation(xxx)**的方式表明如果哪个方法上添加了xxx注解,则就使用该切面做增强。

同时在每个增强的方法上使用该切面,随后编写正常的方法增强逻辑即可。

测试用Controller类


@RestController
@RequestMapping("/person")
public class PersonController {

@Log
   @GetMapping("/test")
   public void test(){
       System.out.println("方法执行了");
   }

}

此时在需要使用切面的方法上加入**@Log**注解,调用该方法,查看效果。

方法执行前
方法执行了
方法执行后

总结

两种方式均能实现AOP的功能,在使用上,如果某个包下面的所有方法,都需要这个切面进行增强,那么使用execution表达式的方式更方便。但如果只有部分方法需要,并且分布在不同的类中,则注解的方式更灵活。

来源:https://juejin.cn/post/6971606712281219086

标签:SpringBoot,定位,切点
0
投稿

猜你喜欢

  • 解决mybatis-plus3.1.1版本使用lambda表达式查询报错的方法

    2022-03-19 03:55:09
  • 实例分析Java中public static void main(String args[])是什么意思

    2023-10-18 16:34:01
  • JAVA遍历一个文件夹中的所有文件的小例子

    2023-04-07 17:13:49
  • C语言形参和实参的区别详解

    2023-08-27 19:41:53
  • SpringBoot之Helloword 快速搭建一个web项目(图文)

    2023-08-23 17:36:21
  • C#多线程之Thread中Thread.IsAlive属性用法分析

    2023-07-11 11:44:12
  • c# ArrayList的使用方法小总结

    2023-04-13 17:16:22
  • C#网络编程基础之进程和线程详解

    2023-03-22 07:38:32
  • Springboot整合企业微信机器人助手推送消息的实现

    2023-08-18 08:37:37
  • java——多线程基础

    2021-08-08 04:14:25
  • Android开发悬浮按钮 Floating ActionButton的实现方法

    2023-05-02 10:44:07
  • 深度解析Java中ArrayList的使用

    2023-06-16 23:26:01
  • java实现连连看游戏课程设计

    2023-10-30 13:18:37
  • Spring Security认证的完整流程记录

    2021-12-15 13:04:03
  • 通过实例解析java过滤器和拦截器的区别

    2022-12-21 05:02:45
  • Java实现数组转字符串及字符串转数组的方法分析

    2022-04-14 10:53:44
  • Java线程池ThreadPoolExecutor原理及使用实例

    2022-04-30 05:53:00
  • Spring Security保护用户密码常用方法详解

    2023-01-24 17:06:18
  • Java同步锁Synchronized底层源码和原理剖析(推荐)

    2023-09-25 08:36:22
  • Java开发之spring security实现基于MongoDB的认证功能

    2022-06-29 15:52:32
  • asp之家 软件编程 m.aspxhome.com