请选择 进入手机版 | 继续访问电脑版

[java] SpringBoot@Aspect 打印访问哀求 和返回数据方式

[复制链接]
查看31 | 回复8 | 2021-9-13 02:12:55 | 显示全部楼层 |阅读模式
目次

SpringBoot@Aspect 打印访问哀求 和返回数据

为什么要用aspect, 利用 aspect 可以使记录日记 的功能面向切面,如许 可以降低代码的耦合性。提供了两种方式对输入输出的数据举行 打日记 ,如下:

aspect:第一种方式

@Before 和 @AfterReturning 来对 controller 举行 切面。

SpringBoot@Aspect 打印访问哀求
和返回数据方式

输出数据:

SpringBoot@Aspect 打印访问哀求
和返回数据方式

aspect:第二种方式

@Around 来对controller 举行 切面。

SpringBoot@Aspect 打印访问哀求
和返回数据方式

输出数据:

SpringBoot@Aspect 打印访问哀求
和返回数据方式

两种方法都是可以或许 对哀求 数据做日记 监控。

第一种方式和第二种方式有一些不同,第二种方式利用 的是@Around 环绕的方式去做的处理,joinPoint.proceed()返回数据必要 等方法实行 完才能实行 下面的代码,这种是壅闭 式的哀求 ,以是 个人建议还是采用第一种方法比较合适。

SpringBoot @Aspect注解详情

1、添加maven依靠 注解

  1. <!--springBoot的aop-->
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-aop</artifactId>
  5. </dependency>
复制代码

2、添加AOP类

  1. @Component
  2. @Aspect
  3. public class JournalServiceAspect {
  4. }
复制代码

3、设置切面点

  1. /**切面点*/
  2. private final String POINT_CUT = "execution(* com.xx.xx..*(..))";
  3. @Pointcut(POINT_CUT)
  4. private void pointcut(){}
复制代码

4、设置 前置关照

  1. /**
  2. * 前置通知,方法调用前被调用
  3. * @param joinPoint
  4. */
  5. @Before(value = POINT_CUT)
  6. public void before(JoinPoint joinPoint){
  7. logger.info("前置通知");
  8. //获取目标方法的参数信息
  9. Object[] obj = joinPoint.getArgs();
  10. //AOP代理类的信息
  11. joinPoint.getThis();
  12. //代理的目标对象
  13. joinPoint.getTarget();
  14. //用的最多 通知的签名
  15. Signature signature = joinPoint.getSignature();
  16. //代理的是哪一个方法
  17. logger.info("代理的是哪一个方法"+signature.getName());
  18. //AOP代理类的名字
  19. logger.info("AOP代理类的名字"+signature.getDeclaringTypeName());
  20. //AOP代理类的类(class)信息
  21. signature.getDeclaringType();
  22. //获取RequestAttributes
  23. RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
  24. //从获取RequestAttributes中获取HttpServletRequest的信息
  25. HttpServletRequest request = (HttpServletRequest) requestAttributes.resolveReference(RequestAttributes.REFERENCE_REQUEST);
  26. //如果要获取Session信息的话,可以这样写:
  27. //HttpSession session = (HttpSession) requestAttributes.resolveReference(RequestAttributes.REFERENCE_SESSION);
  28. //获取请求参数
  29. Enumeration<String> enumeration = request.getParameterNames();
  30. Map<String,String> parameterMap = Maps.newHashMap();
  31. while (enumeration.hasMoreElements()){
  32. String parameter = enumeration.nextElement();
  33. parameterMap.put(parameter,request.getParameter(parameter));
  34. }
  35. String str = JSON.toJSONString(parameterMap);
  36. if(obj.length > 0) {
  37. logger.info("请求的参数信息为:"+str);
  38. }
  39. }
复制代码

**留意 :这里用到了JoinPoint和RequestContextHolder。

1)、通过JoinPoint可以获得关照 的署名 信息,如目的 方法名、目的 方法参数信息等。

2)、通过RequestContextHolder来获取哀求 信息,Session信息。**

5、设置 后置返回关照

  1. /**
  2. * 后置返回通知
  3. * 这里需要注意的是:
  4. * 如果参数中的第一个参数为JoinPoint,则第二个参数为返回值的信息
  5. * 如果参数中的第一个参数不为JoinPoint,则第一个参数为returning中对应的参数
  6. * returning:限定了只有目标方法返回值与通知方法相应参数类型时才能执行后置返回通知,否则不执行,
  7. * 对于returning对应的通知方法参数为Object类型将匹配任何目标返回值
  8. * @param joinPoint
  9. * @param keys
  10. */
  11. @AfterReturning(value = POINT_CUT,returning = "keys")
  12. public void doAfterReturningAdvice1(JoinPoint joinPoint,Object keys){
  13. logger.info("第一个后置返回通知的返回值:"+keys);
  14. }
  15. @AfterReturning(value = POINT_CUT,returning = "keys",argNames = "keys")
  16. public void doAfterReturningAdvice2(String keys){
  17. logger.info("第二个后置返回通知的返回值:"+keys);
  18. }
复制代码

6、后置非常 关照

  1. /**
  2. * 后置异常通知
  3. * 定义一个名字,该名字用于匹配通知实现方法的一个参数名,当目标方法抛出异常返回后,将把目标方法抛出的异常传给通知方法;
  4. * throwing:限定了只有目标方法抛出的异常与通知方法相应参数异常类型时才能执行后置异常通知,否则不执行,
  5. * 对于throwing对应的通知方法参数为Throwable类型将匹配任何异常。
  6. * @param joinPoint
  7. * @param exception
  8. */
  9. @AfterThrowing(value = POINT_CUT,throwing = "exception")
  10. public void doAfterThrowingAdvice(JoinPoint joinPoint,Throwable exception){
  11. //目标方法名:
  12. logger.info(joinPoint.getSignature().getName());
  13. if(exception instanceof NullPointerException){
  14. logger.info("发生了空指针异常!!!!!");
  15. }
  16. }
复制代码

7、后置终极 关照

  1. /**
  2. * 后置最终通知(目标方法只要执行完了就会执行后置通知方法)
  3. * @param joinPoint
  4. */
  5. @After(value = POINT_CUT)
  6. public void doAfterAdvice(JoinPoint joinPoint){
  7. logger.info("后置最终通知执行了!!!!");
  8. }
复制代码

8、环绕关照

  1. /**
  2. * 环绕通知:
  3. * 环绕通知非常强大,可以决定目标方法是否执行,什么时候执行,执行时是否需要替换方法参数,执行完毕是否需要替换返回值。
  4. * 环绕通知第一个参数必须是org.aspectj.lang.ProceedingJoinPoint类型
  5. */
  6. @Around(value = POINT_CUT)
  7. public Object doAroundAdvice(ProceedingJoinPoint proceedingJoinPoint){
  8. logger.info("环绕通知的目标方法名:"+proceedingJoinPoint.getSignature().getName());
  9. try {
  10. Object obj = proceedingJoinPoint.proceed();
  11. return obj;
  12. } catch (Throwable throwable) {
  13. throwable.printStackTrace();
  14. }
  15. return null;
  16. }
复制代码

以上为个人履历 ,渴望 能给大家一个参考,也渴望 大家多多支持脚本之家。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

avatar Guogangts | 2021-9-13 04:11:15 | 显示全部楼层
今天过得很不爽!
回复

使用道具 举报

avatar 幂倾城淮 | 2021-9-19 12:06:09 | 显示全部楼层
帖子很有深度!
回复

使用道具 举报

avatar 123456811 | 2021-9-19 13:59:24 | 显示全部楼层
刚分手,心情不好!
回复

使用道具 举报

avatar 飞一航符cx | 2021-9-20 10:05:10 | 显示全部楼层
看在admin楼主的面子上,认真回帖!
回复

使用道具 举报

avatar 度素告 | 2021-9-26 23:33:24 | 显示全部楼层
admin楼主,你妈妈喊你回家吃饭!
回复

使用道具 举报

avatar 淡然一笑wwl | 2021-10-6 16:57:45 | 显示全部楼层
看了这么多帖子,第一次看看到这么有内涵的!
回复

使用道具 举报

avatar 喵呜_520 | 昨天 02:04 | 显示全部楼层
楼上是GG还是MM啊?
回复

使用道具 举报

avatar 张永峰 | 昨天 20:57 | 显示全部楼层
每次看到admin楼主的帖子都有惊吓!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则