纯净、安全、绿色的下载网站

首页|软件分类|下载排行|最新软件|IT学院

当前位置:首页IT学院IT技术

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

LukeLong   2021-06-09 我要评论
想了解SpringBoot中定位切点的两种常用方法的相关内容吗LukeLong在本文为您仔细讲解SpringBoot 定位切点的相关知识和一些Code实例欢迎阅读和指正我们先划重点:SpringBoot,定位切点,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表达式的方式更方便但如果只有部分方法需要并且分布在不同的类中则注解的方式更灵活


相关文章

猜您喜欢

  • Java字节流复制图片音频 Java使用字节流实现图片音频的复制

    想了解Java使用字节流实现图片音频的复制的相关内容吗wasane在本文为您仔细讲解Java字节流复制图片音频的相关知识和一些Code实例欢迎阅读和指正我们先划重点:Java字节流复制图片音频,Java字节流下面大家一起来学习吧..
  • java多种锁和阻塞队列 Java多线程之多种锁和阻塞队列

    想了解Java多线程之多种锁和阻塞队列的相关内容吗若能绽放光丶在本文为您仔细讲解java多种锁和阻塞队列的相关知识和一些Code实例欢迎阅读和指正我们先划重点:java锁,java阻塞队列下面大家一起来学习吧..

网友评论

Copyright 2020 www.fresh-weather.com 【世纪下载站】 版权所有 软件发布

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 点此查看联系方式