AOP称为面向切面编程,在程序开发中主要用来解决一些系统层面上的问题,比如日志,事务,权限等。

AOP简介

AOP全称Aspect Oriented Programming,面向切面,AOP主要实现的目的是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效果。其与设计模式完成的任务差不多,是提供另一种角度来思考程序的结构,来弥补面向对象编程的不足。

  通俗点讲就是提供一个为一个业务实现提供切面注入的机制,通过这种方式,在业务运行中将定义好的切面通过切入点绑定到业务中,以实现将一些特殊的逻辑绑定到此业务中。

  比如,现在需要打印请求、响应信息,很多地方有需要,这时候又不能把代码复制一遍,所有需要AOP来实现。

常用注解说明

@Aspect -- 作用是把当前类标识为一个切面供容器读取
@Pointcut -- (切入点):就是带有通知的连接点,在程序中主要体现为书写切入点表达式
@Before -- 标识一个前置增强方法,相当于BeforeAdvice的功能
@AfterReturning -- 后置增强,相当于AfterReturningAdvice,方法退出时执行
@AfterThrowing -- 异常抛出增强,相当于ThrowsAdvice
@After -- final增强,不管是抛出异常或者正常退出都会执行
@Around -- 环绕增强,相当于MethodInterceptor

pom.xml中引入AOP的jar包

<!-- aop --><dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-aop</artifactId></dependency>        <!-- fastjson --><dependency>    <groupId>com.alibaba</groupId>    <artifactId>fastjson</artifactId>    <version>1.2.47</version></dependency>

切面类代码

package com.example.helloSpringBoot.aop;

import com.alibaba.fastjson.JSON;import org.aspectj.lang.ProceedingJoinPoint;import org.aspectj.lang.annotation.Around;import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.Pointcut;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.context.annotation.Configuration;import org.springframework.web.context.request.RequestAttributes;import org.springframework.web.context.request.RequestContextHolder;import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;

/** * 切面 打印请求、返回参数信息 */@Aspect // 定义一个切面@Configurationpublic class LogRecordAspect {    private static final Logger logger = LoggerFactory.getLogger(LogRecordAspect.class);

    // 定义切点Pointcut    @Pointcut("execution(* com.example.helloSpringBoot.controller.*Controller.*(..))")    public void excudeService() {    }

    @Around("excudeService()")    public Object doAround(ProceedingJoinPoint pjp) throws Throwable {        RequestAttributes ra = RequestContextHolder.getRequestAttributes();        ServletRequestAttributes sra = (ServletRequestAttributes) ra;        HttpServletRequest request = sra.getRequest();

        String method = request.getMethod();        String uri = request.getRequestURI();        String paraString = JSON.toJSONString(request.getParameterMap());        logger.info("***************************************************");        logger.info("请求开始, URI: {}, method: {}, params: {}", uri, method, paraString);

        // result的值就是被拦截方法的返回值        Object result = pjp.proceed();        logger.info("请求结束,controller的返回值是 " + JSON.toJSONString(result));        return result;    }}

测试打印结果

浏览器分别访问 http://localhost:8080/hello?a=1&b=2 和http://localhost:8080/hello?c=11&d=22,控制台打印结果如下:

***************************************************请求开始, URI: /hello, method: GET, params: {"a":["1"],"b":["2"]}请求结束,controller的返回值是 "hello spring boot!"***************************************************请求开始, URI: /hello, method: GET, params: {"c":["11"],"d":["22"]}请求结束,controller的返回值是 "hello spring boot!"

下面的是我的公众号二维码图片,欢迎关注,欢迎留言,一起学习,一起进步。

转载于:https://www.cnblogs.com/haha12/p/10405839.html

Spring Boot使用AOP在控制台打印请求、响应信息相关推荐

  1. spring mvc通过aop在控制台打印log日志,包含请求controller、method、url、remoteaddr、返回值,方便调试

    1:导入对应的包 在maven xml文件中加入 <!-- https://mvnrepository.com/artifact/org.aspectj/aspectjrt -->< ...

  2. Spring Boot——基于AOP的HTTP操作日志解决方案

    解决方案 package com.hailiu.web.aop;import com.fasterxml.jackson.databind.ObjectMapper; import com.haili ...

  3. Spring Boot 使用 AOP 实现页面自适应

    鉴于复杂页面自适应的难度,一般会做几套模板分别适应手机.平板.电脑等设备.使用 Spring Boot 开发单体应用时,一般会使用 Thymeleaf 模板,那么可以使用 AOP 技术来实现页面自适应 ...

  4. Spring Boot 集成AOP

    在这里多谈一些关于AOP 方面的知识,如果你对AOP 方面的知识比较熟悉,可以直接略过这个段落,往下看. 一.AOP概述 AOP(面向切面编程) 概念:这种在运行时,动态地将代码切入到类的指定方法.指 ...

  5. Spring Boot中使用log4j实现http请求日志入mongodb

    之前在<使用AOP统一处理Web请求日志>一文中介绍了如何使用AOP统一记录web请求日志.基本思路是通过aop去切web层的controller实现,获取每个http的内容并通过log4 ...

  6. Spring Boot使用CommonsRequestLoggingFilter记录传入的请求

    原理 Spring 自带 AbstractRequestLoggingFilter,在处理请求之前和之后执行日志记录操作,这个过滤器需要一个子类来覆盖beforeRequest(HttpServlet ...

  7. Spring boot自定义切面拦截所有的请求 或者方法原理一样

    原代码 下面的例子是小编在自己的环境中测试过得. 代码 **@Pointcut("!execution(public * com..controller.SysLoginController ...

  8. 聊聊Spring Boot服务监控,健康检查,线程信息,JVM堆信息,指标收集,运行情况监控等!...

    来自:https://juejin.im/post/5e2179def265da3e152d2561 前言 去年我们项目做了微服务1.0的架构转型,但是服务监控这块却没有跟上.这不,最近我就被分配了要 ...

  9. Spring Boot 服务监控,健康检查,线程信息,JVM堆信息,指标收集,运行情况监控...

    作者:Richard_Yi 来源:http://39sd.cn/B2A0B 去年我们项目做了微服务1.0的架构转型,但是服务监控这块却没有跟上.这不,最近我就被分配了要将我们核心的微服务应用全部监控起 ...

最新文章

  1. python opencv 中bmp转raw格式图片并展示
  2. 理解深度学习中的学习率及多种选择策略
  3. 中兴同美司法部和解协议获准:罚12亿美元
  4. NYOJ 659 判断三角形
  5. python模块之re正则表达式
  6. VTK:几何对象之ColoredLines
  7. c语言用什么能暂存结构指针,c语言中什么是指针
  8. 控制器局域网can总线
  9. 在python中、实例变量在类的内部通过_[宜配屋]听图阁
  10. 学成在线--11.RabbitMQ快速入门
  11. 风控策略分析中最重要的五步心法
  12. td中bug处理过程_特斯拉的致命BUG,埃安LX的L3能解开吗?
  13. plsql打开sql窗口快捷键_可以提升3倍开发效率的 Intellij IDEA快捷键大全汇总(2019)...
  14. 随机获取部分ListObject集合
  15. C# dataGridView控件 字体配置问题 字体大小 修改字体
  16. SaaS-HRM(2)数据库设计与前端框架(企业管理前后台)
  17. uchome持久XSS(2.0版本测试通过)
  18. HTML入门学习教程:简单网页制作
  19. Java学多久可以接项目_自学Java,多久可以找到工作?
  20. FxCAD实验一 简单图形的绘制

热门文章

  1. java求最小生成树的权重_给定有权无向图的邻接矩阵如下,求其最小生成树的总权重,代码。...
  2. pythonfor循环输入_python的for循环
  3. Jupyter运行GitHub里的MXNet源代码
  4. 高级排序之分割法(以某数为基准分割)
  5. git使用git push 命令跳出remote: Permission to Aname denied to usernameB 的问题
  6. VoIP之语音编码器
  7. 关于 IdentityServer4 中的 Jwt Token 与 Reference Token
  8. 【逆序对相关/数学】【P1966】【NOIP2013D1T2】 火柴排队
  9. tastypie使用cache对list data无效问题
  10. Visual Studio 2015 RC中的ASP.NET新特性和问题修正