SpringBoot AOP使用笔记

 更新时间:2019年01月30日 11:31:40   作者:裴星宙  
今天小编就为大家分享一篇关于SpringBoot AOP使用笔记,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

1. 启用AOP

a. 在类上添加@Aspect注解

b. 注入该类, 可以使用@Component进行注入到Spring容器中

2. 通过PointCut对象创建切入点

a. 在某个方法使用类似下面的方法进行注入

@Pointcut("execution(* com.sguess.service.IAOPService.*(..))")
  private void pointcut() {
  }

i. 其中,execution表达式为
execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern)throws-pattern?)  
ii. 注意, pointcut()方法名是后面切入的时候需要使用的
iii. 方法内可以什么也不写, 写了也调不到
iv. 也可以创建多个PointCut,例如再创建一个

@Pointcut("execution(* com.sguess.service.IAOPService.fun1(..))")
    private void pointcut2() {
    }

这个的方法名就位pointcut2, 方法名不一样.  

b. 创建After方法,Before方法

@After(value = "pointcut()")
  public void doAfter() {
    System.out.println("Do AOP After function 01");
  }

i. After方法是指, 在配置了的切入点被执行后, 执行该方法. 
ii. value中的pointcut() 是我们前面在创建@Pointcut中的方法名. 也就是说,是通过方法名和切入点进行匹配的. 
iii. 这个的方法名可以随便起. 
iv. Before方法同理

c. 带Return的After方法,

@AfterReturning(returning = "str", pointcut = "pointcut()")
  public void doAfterReturning(String str) throws Exception {
    System.out.println("Return value is: " + str);
  }

i. AfterReturn是指在被切入的方法执行后, 获取其返回值, 再执行该方法. 注意关键, 这个可以进行操作返回值. 
ii. returning = "str",是指, 假设切入方法的返回的值变量名为str
doAfterReturning(String str)方法的参数变量名必须和和returning保持一致, 这里也叫作str. 然后才能在方法体中使用.
iii. pointcut = "pointcut()"同样是指前面声明的pointcut方法名

3. 通过注解, 使用切入点

a. 监听方法参数

@Before("execution(public int com.sguess.service.*(int, int))")
  public void beforMethod(JoinPoint point) {
    String methodName = point.getSignature().getName();
    List<Object> args = Arrays.asList(point.getArgs());
    System.out.println("Before FunctionName:" + methodName + ",ParameterName:" + args);
  }
  @After("execution(public int com.sguess.service.*(int, int))")
  public void afterMethod(JoinPoint point) {
    String methodName = point.getSignature().getName();
    List<Object> args = Arrays.asList(point.getArgs());
    System.out.println("After FunctionName:" + methodName + ",ParameterName:" + args);
  }

4. 执行顺序:

a.Around的方法优先于Before/After执行,After优先于AfterReturn. 

i. 代码

@Before("execution(public int com.sguess.service.*.*(int, int))")
      public void beforMethod(JoinPoint point) {
        System.out.println("Before function");
      }
      @After("execution(public int com.sguess.service.*.*(int, int))")
      public void afterMethod(JoinPoint point) {
        System.out.println("After function");
      }
      @AfterReturning("execution(public int com.sguess.service.*.*(int, int))")
      public void afterReturnMethod(JoinPoint point) {
        System.out.println("AfterReturn function");
      }
      @AfterThrowing(value = "execution(public int com.sguess.service.*.*(int, int))", throwing = "e")
      public void afterReturningThrowing(JoinPoint point, Exception e) {
        System.out.println("AfterReturnThrowing function");
      }
      @Around("execution(public int com.sguess.service.*.*(int, int))")
      public Object aroundMethod(ProceedingJoinPoint pdj) {
        System.out.println("Start AroundFunction");
        Object result = null;
        try {
          System.out.println("Around process start");
          result = pdj.proceed();
          System.out.println("Around process end");
        } catch (Throwable e) {
          System.out.println("Around process exception");
        }
        System.out.println("After Around process");
        return result;
      }
    }

执行结果:

Start AroundFunction
Around process start
Before function
Around process end
After Around process
After function
AfterReturn function

5.小结:

  @AfterReturning(returning = "str", pointcut = "pointcut()")
  public void doAfterReturning(String str) throws Exception {
    System.out.println("Return value is: " + str);
  }
  @Before("execution(public int com.sguess.service.*.*(int, int))")
  public void beforMethod(JoinPoint point) {
    String methodName = point.getSignature().getName();
    List<Object> args = Arrays.asList(point.getArgs());
    System.out.println("Before FunctionName:" + methodName + ",ParameterName:" + args);
  }
  @After("execution(public int com.sguess.service.*.*(int, int))")
  public void afterMethod(JoinPoint point) {
    String methodName = point.getSignature().getName();
    List<Object> args = Arrays.asList(point.getArgs());
    System.out.println("After FunctionName:" + methodName + ",ParameterName:" + args);
  }
  @AfterThrowing(value = "execution(public int com.sguess.service.*.*(int, int))", throwing = "e")
  public void afterReturningThrowing(JoinPoint point, Exception e) {
    String methodName = point.getSignature().getName();
    List<Object> args = Arrays.asList(point.getArgs());
    System.out.println("AfterReturningThrowing FunctionName:" + methodName + ",ParameterName:" + args + ",Exception:" + e);
  }
  @Around("execution(public int com.sguess.service.*.*(int, int))")
  public Object aroundMethod(ProceedingJoinPoint pdj) {
      System.out.println("Start AroundFunction");
      Object result = null;
      try {
          System.out.println("Around process start");
          result = pdj.proceed();
          System.out.println("Around process end");
      } catch (Throwable e) {
          System.out.println("Around process exception");
      }
      System.out.println("After Around process");
      return result;
  }

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。如果你想了解更多相关内容请查看下面相关链接

相关文章

  • gradle安装配置以及使用最新方法

    gradle安装配置以及使用最新方法

    这篇文章主要给大家介绍了关于gradle安装配置以及使用的相关资料,Gradle是一个基于ApacheAnt和ApacheMaven概念的项目自动化构建开源工具,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2023-11-11
  • SpringBoot数据访问的实现

    SpringBoot数据访问的实现

    本文主要介绍了SpringBoot数据访问的实现,引入各种xxxTemplate,xxxRepository来简化我们对数据访问层的操作,感兴趣的可以了解一下
    2023-11-11
  • ProtoStuff不支持BigDecimal序列化及反序列化详解

    ProtoStuff不支持BigDecimal序列化及反序列化详解

    这篇文章主要为大家介绍了ProtoStuff不支持BigDecimal序列化/反序列化,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • 解决IDEA Gradle构建报错''Cause: zip END header not found''

    解决IDEA Gradle构建报错''Cause: zip END header not found''

    这篇文章主要介绍了解决IDEA Gradle构建报错"Cause: zip END header not found"的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02
  • JAVA中JVM的重排序详细介绍

    JAVA中JVM的重排序详细介绍

    重排序通常是编译器或运行时环境为了优化程序性能而采取的对指令进行重新排序执行的一种手段。重排序分为两类:编译期重排序和运行期重排序,分别对应编译时和运行时环境
    2014-05-05
  • 关于Mybatis动态sql中test的坑点总结

    关于Mybatis动态sql中test的坑点总结

    这篇文章主要介绍了关于Mybatis动态sql中test的坑点,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • idea打不开项目问题的解决过程(典型案例)

    idea打不开项目问题的解决过程(典型案例)

    idea导入项目,起环境的时候经常会碰到项目环境起不来的情况,下面这篇文章主要介绍了idea打不开项目问题的解决过程,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2023-05-05
  • 关于kafka-consumer-offset位移问题

    关于kafka-consumer-offset位移问题

    这篇文章主要介绍了关于kafka-consumer-offset位移问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • Spring Cloud Feign实现动态URL

    Spring Cloud Feign实现动态URL

    本文主要介绍了Spring Cloud Feign实现动态URL,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • 数据同步利器DataX简介及如何使用

    数据同步利器DataX简介及如何使用

    DataX 是阿里云 DataWorks数据集成 的开源版本,使用Java 语言编写,在阿里巴巴集团内被广泛使用的离线数据同步工具/平台,今天给大家分享一个阿里开源的数据同步工具DataX,在Github拥有14.8k的star,非常受欢迎
    2024-02-02

最新评论