AOP统一处理请求日志

AOP为Aspect Oriented Programming的缩写,意为:[面向切面编程]
理论就不说了,直接上代码吧,呵呵~

注解 用途
@Aspect 注解将一个java类定义为切面类
@Pointcut 定义一个切入点,可以是一个规则表达式,比如下例中某个package下的所有函数,也可以是一个注解等。根据需要在切入点不同位置的切入内容
@Before 在切入点开始处切入内容
@After在 切入点结尾处切入内容
@AfterReturning 在切入点return内容之后切入内容(可以用来对处理返回值做一些加工处理)
@Around在切入 点前后切入内容,并自己控制何时执行切入点自身的内容
@AfterThrowing 用来处理当切入内容部分抛出异常之后的处理逻辑

一、先建一个切面类文件吧

1.在包目录右键-New-Aspect

建切面类1.png

2.然后会弹出框,输出类名,下方选择框一定要选 @Aspect,如下图:

建切面类2.png

3.工程目录如下:

工程目录.png

二、代码

  1. 切面类的代码
@Aspect
@Component
public class TestAspect {@Before("execution(public * com.alun.Controller.TestController.*(..))")public  void onTestBefore(){System.out.print("-------------------------------------------调用前\n");}@After("execution(public * com.alun.Controller.TestController.*(..))")public  void onTestAfter(){System.out.print("--------------------------------------------调用后\n");}
}
  1. Controller的代码
@RestController
public class TestController {@GetMapping("/firstTest")public  String getFirst(){System.out.print("-----------------我被调用了---------------\n");return "你好!";}
}
  1. 运行结果

运行结果1.png

运行结果2.png

4.打印相关信息

@Aspect
@Component
public class TestAspect {private final static Logger logger = LoggerFactory.getLogger(TestAspect.class);@Pointcut("execution(public * com.alun.Controller.TestController.*(..))")public void testLog() {}@Before("testLog()")public void onTestBefore(JoinPoint joinPoint) {logger.info("-------------------------------------------调用前\n");//记录http请求ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();HttpServletRequest request = attributes.getRequest();//从request中获取http请求的urllogger.info("url={}", request.getRequestURI());///请求的方法类型logger.info("method={}", request.getMethod());//IP地址logger.info("ip={}", request.getRemoteAddr());//响应该http请求的类方法logger.info("class_method={}", joinPoint.getSignature().getDeclaringTypeName() +"." + joinPoint.getSignature().getName());//请求中的参数logger.info("args={}", joinPoint.getArgs());}@AfterReturning(returning = "object", pointcut = "testLog()")public void doAfterReturning(Object object) {logger.info("响应内容={}", object);}@After("testLog()")public void onTestAfter() {logger.info("--------------------------------------------调用后\n");}
}
  • 这里使用了org.slf4j.Logger打印日志,可以输出更多信息,如时间和相关类
  • @Before和@After等括号的内容都一样,可以提炼出来,使用@Pointcut实现
  • @Pointcut的使用:
    格式:
execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern)throws-pattern?)

括号中各个pattern分别表示:

  • 修饰符匹配(modifier-pattern?)
  • 返回值匹配(ret-type-pattern)可以为*表示任何返回值,全路径的类名等
  • 类路径匹配(declaring-type-pattern?)
  • 方法名匹配(name-pattern)可以指定方法名 或者 代表所有, set 代表以set开头的所有方法
  • 参数匹配((param-pattern))可以指定具体的参数类型,多个参数间用“,”隔开,各个参数也可以用“”来表示匹配任意类型的参数,如(String)表示匹配一个String参数的方法;(,String) 表示匹配有两个参数的方法,第一个参数可以是任意类型,而第二个参数是String类型;可以用(..)表示零个或多个任意参数
  • 异常类型匹配(throws-pattern?)
    其中后面跟着“?”的是可选项
    这段内容来至于这里

运行结果:

运行结果

AOP切面的优先级

由于通过AOP实现,程序得到了很好的解耦,但是也会带来一些问题,比如:我们可能会对
Web层做多个切面,校验用户,校验头信息等等,这个时候经常会碰到切面的处理顺序问题。

所以,我们需要定义每个切面的优先级,我们需要@Order(i)注解来标识切面的优先级。i的值越> > 小,优先级越高。假设我们还有一个切面是CheckNameAspect用来校验name必须为didi,我们
为其设置@Order(10),而上文中WebLogAspect设置为@Order(5),所以WebLogAspect有更高
的优先级,这个时候执行顺序是这样的:

在@Before中优先执行@Order(5)的内容,再执行@Order(10)的内容
在@After和@AfterReturning中优先执行@Order(10)的内容,再执行@Order(5)的内容
所以我们可以这样子总结:

在切入点前的操作,按order的值由小到大执行
在切入点后的操作,按order的值由大到小执行

Spring Boot 学习之,AOP统一处理请求日志相关推荐

  1. Spring Boot中使用AOP统一处理Web请求日志

    AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是Spring框架中的一个重要内容,它通 ...

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

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

  3. AOP统一处理请求日志

    1.添加依赖 spring-boot-starter-aop 2.建立处理文件 在访问到GirlController中方法之前,拦截所有GirlController中的方法: 只拦截gilrList方 ...

  4. SpringBoot AOP完全讲解二:统一处理请求日志

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/80669451 本文出自[赵彦军的博客] 前言 不了解 AOP 概念的同学,请先看 ...

  5. Spring Boot学习——统一异常处理

    Spring Boot学习--统一异常处理 参考文章: (1)Spring Boot学习--统一异常处理 (2)https://www.cnblogs.com/aston/p/7258834.html ...

  6. Spring Boot学习笔记-基础(2)

    Spring Boot学习笔记-基础(2) Spring Boot 优点: – 快速创建独立运行的Spring项目以及与主流框架集成 – 使用嵌入式的Servlet容器,应用无需打成WAR包 – st ...

  7. erp开发和java开发区别_Java程序员求职必学:Spring boot学习指南!

    黑马程序员上海中心 学姐微信:CZBKSH 关注 咳咳,今天学姐就来和你们说说Spring对于Java程序员的重要性. 首先,Spring 官网首页是这么介绍自己的--"Spring: th ...

  8. Spring Boot学习的总结

    Spring Boot 1.什么是SpringBoot? SpringBoot是Spring团队在2014年,伴随Spring4.0版本推出的一个新的框架. https://spring.io/ Sp ...

  9. Spring Boot 2.1之后如何在启动日志中打印请求路径列表

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | 翟永超 来源 | http://blog.di ...

最新文章

  1. 特殊字符的正则表达式
  2. LeetCode Max Points on a Line
  3. Bullet 物理引擎 详细分析 Dbvt (4)
  4. [NewLife.XCode]数据初始化
  5. s7-300 400plc应用技术_西门子S7300/400顺序功能图设计教程,看完豁然开朗!
  6. 菜鸟学习笔记:Java提升篇6(IO流2——数据类型处理流、打印流、随机流)
  7. 参数过滤mongodb过滤查询键值
  8. oracle dba 两日速成课程.pdf,oracle_dba_两日速成课程.pdf
  9. NEC公司日前正式回绝了AMD的传唤请求
  10. jQuery(3)——如何绑定事件
  11. 锐捷客户端显示无法连接认证服务器,锐捷客户端连接失败怎么办 锐捷连不上解决办法...
  12. sqlitedev 注册码
  13. 带你极速掌握EMU8086汇编工具,深刻理解微机原理(含安装与快速上手教程)
  14. 服务器ssd内存性能对比,真是大快人心 九款240/256G SSD大横评
  15. 放大图片模糊怎么变清晰?
  16. 飞机大战,坦克大战源码、简单仿记事本、错题本源码及笔记
  17. 浅读《图解密码技术》--学习笔记
  18. quoted-printable解码程序
  19. Windows下的U盘监控
  20. 易基因|TSD物种全基因组DNA甲基化模式对孵育性别和过去孵育温度的响应 | 性别决定

热门文章

  1. Javascript 之《函数传参到底是值传递还是引用传递》
  2. wp实例开发精品文章源码推荐(8.20)
  3. 编译器错误消息: CS0006: 未能找到元数据文件 System.EnterpriseServices
  4. 微表情如何用计算机分析计算,面部微表情识别若干关键技术之计算机研究
  5. linux绑定中文域名,linux shell正则表达式如何匹配域名(包含中文域名)
  6. 获取浏览器高度_鸡哥解读FILECOIN浏览器之幸运值
  7. 数组中其余的排除_带你一步步精通数组之十五:数组的计算规律之五
  8. java 执行js selenium_如何在Selenium WebDriver Java中使用JavaScript
  9. 插画素材 | 圣诞节设计离不了!
  10. 彩色烟雾一直是许多摄影师和摄影爱好者的首选武器