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;
  }

总结

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

(0)

相关推荐

  • eclipse下整合springboot和mybatis的方法步骤

    1.新建maven项目 先新建一个maven项目,勾选上creat a simple project,填写groupid,artifactid 2.建立项目结构 3.添加依赖 <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.3.RELEASE<

  • SpringBoot之LogBack配置详解

    LogBack 默认集成在 Spring Boot 中,是基于 Slf4j 的日志框架.默认情况下 Spring Boot 是以 INFO 级别输出到控制台. 它的日志级别是: ALL < TRACE < DEBUG < INFO < WARN < ERROR < OFF 配置 LogBack 可以直接在 application.properties 或 application.yml 中配置,但仅支持一些简单的配置,复杂的文件输出还是需要配置在 xml 配置文件中.配

  • 在SpringBoot中通过jasypt进行加密解密的方法

    1.用途 在SpringBoot中,通过jasypt可以进行加密解密. 这个是双向的, 且可以配置密钥. 2.使用: 2.1通过UT创建工具类,并认识jasypt import org.jasypt.util.text.BasicTextEncryptor; import org.junit.Test; public class UtilTests { @Test public void jasyptTest() { BasicTextEncryptor encryptor = new Basi

  • SpringBoot thymeleaf eclipse热部署方案操作步骤

    网上找了好多的springboot热部署方案,也尝试了好几种方法,下面是我的成功方案跟大家分享 操作步骤 1.pom中添加热部署依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> </dependency&g

  • SpringBoot实战之SSL配置详解

    1.SSL介绍和说明 SSL的配置也是我们在实际应用中经常遇到的场景 SSL(Secure Sockets Layer,安全套接层)是为网络通信提供安全及数据完整性的一种协议,SSL在网络传输层对网络连接进行加密.SSL协议位于TCP/IP协议与各种应用层协议之间,为数据通信提供安全支持.SSL协议可以分为两层:SSL记录协议(SSL Record Protocal),它建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装.压缩.加密等基础功能的支持.SSL握手协议(SSL Handsh

  • springboot打包不同环境配置以及shell脚本部署的方法

    前言 本篇和大家分享的是springboot打包并结合shell脚本命令部署,重点在分享一个shell程序启动工具,希望能便利工作: profiles指定不同环境的配置 maven-assembly-plugin打发布压缩包 分享shenniu_publish.sh程序启动工具 linux上使用shenniu_publish.sh启动程序 profiles指定不同环境的配置 通常一套程序分为了很多个部署环境:开发,测试,uat,线上 等,我们要想对这些环境区分配置文件,可以通过两种方式: 通过a

  • springboot注册bean的三种方法

    spring在启动时会自己把bean(java组件)注册到ioc容器里,实现控制反转,在开发人员使用spring开发应用程序时,你是看不到new关键字的,所有对象都应该从容器里获得,它们的 生命周期 在放入容器时已经确定! 下面说一下三种注册bean的方法 @ComponentScan @Bean @Import @ComponentScan注册指定包里的bean Spring容器会扫描@ComponentScan配置的包路径,找到标记@Component注解的类加入到Spring容器. 我们经

  • SpringBoot下使用定时任务的方式全揭秘(6种)

    本文旨在用通俗的语言讲述枯燥的知识 定时任务作为一种系统调度工具,在一些需要有定时作业的系统中应用广泛,如每逢某个时间点统计数据.在将来某个时刻执行某些动作...定时任务在主流开发语言均提供相应的API供开发者调用,在Java中,实现定时任务有很多种方式,原生的方式实现一个完整定时任务需要由Timer.TimerTask两个类,Timer是定时器类,用来按计划开启后台线程执行指定任务,TimerTask一个抽象类,它的子类代表一个可以被Timer计划的任务.除此之外,还可以用ScheduledE

  • SpringBoot中关于static和templates的注意事项以及webjars的配置

    1. 默认情况下, 网页存放于static目录下, 默认的"/"指向的是~/resouces/static/index.html文 2. 如果引入了thymeleaf, 则默认指向的地址为~/resouces/templates/index.html <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymel

  • SpringBoot+jsp项目启动出现404的解决方法

    通过maven创建springboot项目启动出现404 application.properties配置 spring.mvc.view.prefix=/WEB-INF/jsp/ spring.mvc.view.suffix=.jsp 项目结构 控制器方法 package com.example.demo.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bi

随机推荐