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

 更新时间:2021年06月09日 15:45:04   作者:LukeLong  
有时候,我们使用AOP来进行放的增强,编写切面类的时候,需要定位在哪个方法上试用该切面进行增强,本片文章主要讲解两种在SpringBoot中定位切点的方法,感兴趣的可以了解一下

有时候,我们使用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表达式的方式更方便。但如果只有部分方法需要,并且分布在不同的类中,则注解的方式更灵活。

到此这篇关于SpringBoot中定位切点的两种常用方法的文章就介绍到这了,更多相关SpringBoot 定位切点内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 挑战4道Java试题

    挑战4道Java试题

    这篇文章主要为大家分享了4道Java基础题,帮助大家巩固基础知识,夯实java基础技能,感兴趣的朋友快点挑战
    2015-12-12
  • SpringMVC实现简单跳转方法(专题)

    SpringMVC实现简单跳转方法(专题)

    这篇文章主要介绍了SpringMVC实现简单跳转方法(专题),详细的介绍了SpringMVC跳转的几种方法,非常具有实用价值,需要的朋友可以参考下
    2018-03-03
  • Java基础之浅谈hashCode()和equals()

    Java基础之浅谈hashCode()和equals()

    今天给大家带来的是关于Java基础的相关知识,文章围绕着hashCode()和equals()展开,文中有非常详细的介绍及代码示例,需要的朋友可以参考下
    2021-06-06
  • C语言指针数组案例详解

    C语言指针数组案例详解

    这篇文章主要介绍了C语言指针数组案例详解,本文通过案例详细的解释了指针与数组的初始化还有关系与应用,需要的朋友可以参考下这篇文章
    2021-07-07
  • Mybatis实现SQL存储流程详解

    Mybatis实现SQL存储流程详解

    MyBatis作为一款优秀的持久层框架,它支持自定义SQL、存储过程以及高级映射。它免除了几乎所有的JDBC代码以及设置参数和获取结果集的工作
    2023-03-03
  • 手把手带你入门 Spring Security的具体流程

    手把手带你入门 Spring Security的具体流程

    这篇文章主要介绍了手把手带你入门 Spring Security,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • maven快速生成SpringBoot打包文件的方法步骤

    maven快速生成SpringBoot打包文件的方法步骤

    本文主要介绍了使用Maven快速生成SpringBoot项目打包文件的方法,包括如何生成可执行的JAR文件,如何将配置文件、运行脚本、调试脚本、证书文件等拷贝到指定目录,及如何编译出部署包,这种方法能大大方便微服务的部署,提高部署效率
    2024-10-10
  • Java基础 Servlet监听器详解

    Java基础 Servlet监听器详解

    这篇文章主要介绍了Java基础 Servlet监听器详解的相关资料,需要的朋友可以参考下
    2017-07-07
  • java 相交链表的实现示例

    java 相交链表的实现示例

    本文主要介绍了java 相交链表的实现示例,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • SpringBoot实现RAS+AES自动接口解密

    SpringBoot实现RAS+AES自动接口解密

    本文主要介绍了SpringBoot实现RAS+AES自动接口解密,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03

最新评论