欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

springboot中使用aop技术

程序员文章站 2023-04-04 13:32:29
aop是面向切面编程的意思,它可以需要先选择一些切入点,然后对这些切入点进行拦截,注入统一的代码逻辑,这也是解耦的一种方式,也是为了避免重复的代码,让开发人员把关注点放在业务上。 引用包 添加切入点 测试 当我们访问controller下的接口下,在控制台中将输出方法执行前和执行后的结果 感想 事实 ......

aop是面向切面编程的意思,它可以需要先选择一些切入点,然后对这些切入点进行拦截,注入统一的代码逻辑,这也是解耦的一种方式,也是为了避免重复的代码,让开发人员把关注点放在业务上。

引用包

'org.springframework.boot:spring-boot-starter-aop'

添加切入点

/**
 * 基于com.lind.basic.controller包下的方法进行拦截.
 */
@aspect
@component
public class aopprintconstcontroller {
  private static final logger logger = loggerfactory.getlogger(aopprintconstcontroller.class);

  /**
   * 横切点,哪些方法需要被横切.
   */
  @pointcut(value = "execution(public * com.lind.basic.controller..*.*(..))")
  public void cutoffpoint() {
  }

  /**
   * @param joinpoint 具体的方法之前执行.
   */
  @before("cutoffpoint()")
  public void dobefore(joinpoint joinpoint) throws throwable {
    logger.info("cutoffpoint.before...");
    servletrequestattributes requestattributes = (servletrequestattributes) requestcontextholder.getrequestattributes();
    httpservletrequest request = requestattributes.getrequest();
    string requesturi = request.getrequesturi();
    string remoteaddr = request.getremoteaddr();   //这个方法取客户端ip"不够好"
    string requestmethod = request.getmethod();
    string declaringtypename = joinpoint.getsignature().getdeclaringtypename();
    string methodname = joinpoint.getsignature().getname();
    object[] args = joinpoint.getargs();
    logger.info("请求url=" + requesturi + ",客户端ip=" + remoteaddr + ",请求方式=" + requestmethod + ",请求的类名=" + declaringtypename + ",方法名=" + methodname + ",入参=" + args);

  }

  /**
   * 解用于获取方法的返回值.
   *
   * @param obj 返回值
   */
  @afterreturning(returning = "obj", pointcut = "cutoffpoint()")
  public void dobefore(object obj) throws throwable {
    logger.info("response : " + obj);
  }


}

测试

当我们访问controller下的接口下,在控制台中将输出方法执行前和执行后的结果

com.lind.basic.aopprintconstcontroller   : 请求url=/hello/1,客户端ip=0:0:0:0:0:0:0:1,请求方式=get,请求的类名=...
com.lind.basic.controller.h com.lind.basic.aopprintconstcontroller   : response : <200 ok,com.lind.basic.entity.token@249f92d9,{}>

感想

事实上,springboot真的是一个强大的脚手架,它帮助我们把很多依赖都结合了,像今天说的aop,事实上springboot帮我们把以下包都结合在一起了,让开发人员引用时更方便。

springboot-aop集成了

  • spring-aop,
  • aspectjrt,
  • spectjweaver