SpringBoot开发教程之AOP日志处理

 更新时间:2021年10月17日 10:16:32   作者:xbhog  
现在凡是企业级的或者稍微大点项目,基本都需要日志管理,下面这篇文章主要给大家介绍了关于SpringBoot开发教程之AOP日志处理 的相关资料,需要的朋友可以参考下

日志处理:

需求分析

日志处理需要记录的是:

  1. 请求的URL
  2. 访问者IP
  3. 调用的方法
  4. 传入的参数
  5. 返回的内容

上面的内容要求在控制台和日志中输出。

在学习这部分知识的时候,真的感觉收获很多,在之前Spring学习的aop只是初步了解,现在有了一些深入的理解。好记性不如烂笔头!

在日志处理这部分主要是aop的使用,通过切面的方式来整合到项目了,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

人话:Aop 在不改变原有代码的情况下 , 去增加新的功能

需要了解的:

  • 横切关注点:跨越应用程序多个模块的方法或功能。即是,与我们业务逻辑无关的,但是我们需要关注的部分,就是横切关注点。如日志 , 安全 , 缓存 , 事务等等 ....
  • 切面(ASPECT):横切关注点 被模块化 的特殊对象。即,它是一个类。
  • 通知(Advice):切面必须要完成的工作。即,它是类中的一个方法。
  • 切入点(PointCut):切面通知 执行的 “地点”的定义。
  • 连接点(JointPoint):与切入点匹配的执行点。

通知(Advice)里面还有几种方法来帮助实现,这里我列举了该部分实现的方法:

  1. doBefore方法(方法前执行),需要注解@Before实现
  2. After方法(方法后执行),需要注解@After实现
  3. doAfterReturning方法,需要注解@AfterReturning实现

具体实现看后面部分。

重要部分:导入依赖

<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
    <version>1.9.4</version>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
    <scope>test</scope>
</dependency>

提醒:导入包以后,刷新下Maven,如果运行的时候找不到包,重启试试,网上有很多的解决方法(也试过),最后个人只是重启一下子再刷新下maven就可以使用了。

这里就没有给出解决方法,只是一个提醒。

实现过程:

创建一个类(LogAspect),将该类定义成一个切面(@Aspect)并且加入容器中(@Component)。

首先创建一个切入点,后面的Advice是建立在切入点上:

@Pointcut("execution(* com.blog.Controller..*.*(..))")
public void log(){}

整个表达式可以分为五个部分

1、execution():表达式主体。

2、第一个*号:表示返回类型,*号表示所有的类型。

3、包名:表示需要拦截的包名,后面的两个句点分别表示当前包和当前包的所有子包,com.blog.Controller包、子孙包下所有类的方法。

4、第二个*号:表示类名,*号表示所有的类。

5、*(..) :第三个星号表示方法名,*号表示所有的方法,后面括弧里面表示方法的参数,两个句点表示任何参数

定义完切入点后,处理前置通知和后置通知:

@Before("log()")
public void doBefore(JoinPoint joinPoint){
    System.out.println("在进入controller之前处理流-------------");
}
@After("log()")
public void doAfter(){
    System.out.println("在进入controller之后处理流-------------");
}
//在切入点return内容之后切入内容(可以用来对处理返回值做一些加工处理)
@AfterReturning(returning = "result",pointcut="log()")
public void doAfterReturning(Object result){
    logger.info("Return ------ {}",result );
}

通过上述的简单介绍,可以知道我们如果需要知道需求里面的要求,我们的重点应该放到前置通知里面,在流处理之前获取前端操作的信息。

核心代码如下:

//通过上下文来获取请求里面的信息
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();

HttpServletRequest request = attributes.getRequest();
//获取封装了署名信息的对象,在该对象中可以获取到目标方法名,所属类的Class等信息(反射)
String classMethod = joinPoint.getSignature().getDeclaringTypeName()+","+joinPoint.getSignature().getName();
// 1. 获取URL
String url = request.getRequestURL().toString();
//2. 获取ip地址
String addr = request.getRemoteAddr();

/*创建一个类RequestData,来保存相关信息*/
RequestData requestData = new RequestData(
    url, addr, classMethod, joinPoint.getArgs()
);
//在控制台打印出来
logger.info("RequestData------{}",requestData);

创建的类是内部类(RequestData),只是封装一下需要打印的信息。

实验效果:

在进入controller之前处理流-------------
2021-08-15 15:19:43.923  INFO 9644 --- [nio-8080-exec-1] com.blog.AspectAop.LogAspect             : RequestData------RequestData{url='http://localhost:8080/', ipAddr='0:0:0:0:0:0:0:1', classMethod='com.blog.Controller.IndexController,index', args=[]}
2021-08-15 15:19:43.932  INFO 9644 --- [nio-8080-exec-1] com.blog.AspectAop.LogAspect             : Return ------ index
在进入controller之后处理流-------------

项目的github地址

参考文献:

狂神说Spring

表达式参数

总结

到此这篇关于SpringBoot开发教程之AOP日志处理的文章就介绍到这了,更多相关SpringBoot AOP日志处理 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java synchronized重量级锁实现过程浅析

    Java synchronized重量级锁实现过程浅析

    这篇文章主要介绍了Java synchronized重量级锁实现过程,synchronized是Java里的一个关键字,起到的一个效果是"监视器锁",它的功能就是保证操作的原子性,同时禁止指令重排序和保证内存的可见性
    2023-02-02
  • JSON在Java中的使用方法实例

    JSON在Java中的使用方法实例

    对于java来说,json的对象也是分为JSONObject和JSONArray这两种,每种对象的操作方式不一样哦,下面这篇文章主要给大家介绍了关于JSON在Java中使用的相关资料,需要的朋友可以参考下
    2023-03-03
  • java调用回调机制详解

    java调用回调机制详解

    这篇文章主要介绍了java调用回调机制详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • 在Spring Boot中使用Spring-data-jpa实现分页查询

    在Spring Boot中使用Spring-data-jpa实现分页查询

    如何使用jpa进行多条件查询以及查询列表分页呢?下面我将介绍两种多条件查询方式。具体实例代码大家参考下本文吧
    2017-07-07
  • MyBatis Map结果的Key转为驼峰式

    MyBatis Map结果的Key转为驼峰式

    今天小编就为大家分享一篇关于MyBatis Map结果的Key转为驼峰式,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • java实现高效下载文件的方法

    java实现高效下载文件的方法

    这篇文章主要为大家详细介绍了java实现高效下载文件的几种方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • Java SSM整合开发统一结果封装详解

    Java SSM整合开发统一结果封装详解

    这篇文章主要介绍了Java SSM整合开发实现统一结果封装,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • Java CharacterEncodingFilter案例详解

    Java CharacterEncodingFilter案例详解

    这篇文章主要介绍了Java CharacterEncodingFilter案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • Java创建线程三种方式的优缺点

    Java创建线程三种方式的优缺点

    今天小编就为大家分享一篇关于Java创建线程三种方式的优缺点,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • Java详细讲解依赖注入的方式

    Java详细讲解依赖注入的方式

    Idea中使用@Autowire注解会出现提示黄线,强迫症患者看着很难受,使用构造器注入或者setter方法注入后可解决,下面我们一起来看看
    2022-06-06

最新评论