1. package com.dch.service.aop;
  2.  
  3. import java.text.SimpleDateFormat;
  4. import java.util.Arrays;
  5. import java.util.Date;
  6.  
  7. import javax.servlet.http.HttpServletRequest;
  8.  
  9. import org.aspectj.lang.JoinPoint;
  10. import org.aspectj.lang.ProceedingJoinPoint;
  11. import org.aspectj.lang.annotation.AfterReturning;
  12. import org.aspectj.lang.annotation.AfterThrowing;
  13. import org.aspectj.lang.annotation.Around;
  14. import org.aspectj.lang.annotation.Aspect;
  15. import org.aspectj.lang.annotation.Before;
  16. import org.aspectj.lang.annotation.Pointcut;
  17. import org.slf4j.Logger;
  18. import org.slf4j.LoggerFactory;
  19. import org.springframework.stereotype.Component;
  20. import org.springframework.web.context.request.RequestContextHolder;
  21. import org.springframework.web.context.request.ServletRequestAttributes;
  22.  
  23. /**
  24. * AOP Controller RestController
  25. *
  26. * @author liu wp
  27. *
  28. */
  29. @Aspect
  30. @Component
  31. public class AutoControllerAspect {
  32. private static SimpleDateFormat dateTimeFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  33. /** 日志类 */
  34. private final Logger logger = LoggerFactory.getLogger(super.getClass());
  35.  
  36. /**
  37. * AfterReturning 核心业务逻辑调用正常退出后,不管是否有返回值,正常退出后,均执行
  38. *
  39. * @param joinPoint
  40. * @param returnObj
  41. * 返回值
  42. */
  43. @AfterReturning(pointcut = "allControllerMethod()||allrestControllerMethod()", returning = "returnObj")
  44. public void afterReturning(final JoinPoint joinPoint, final Object returnObj) {
  45. logger.info("----afterReturning Start 请求时间:{}----", dateTimeFormat.format(new Date()));
  46. logger.info("返回值:{}", returnObj);
  47. logger.info("----afterReturning End 请求时间:{}----", dateTimeFormat.format(new Date()));
  48.  
  49. }
  50.  
  51. /**
  52. * AfterThrowing 核心业务逻辑调用异常退出后执行,处理错误信息
  53. *
  54. * @param joinPoint
  55. * @param ex
  56. * 异常信息
  57. */
  58. @AfterThrowing(value = "allControllerMethod()||allrestControllerMethod()", throwing = "ex")
  59. public void AfterThrowing(final JoinPoint joinPoint, final Exception ex) {
  60. logger.info("----AfterThrowing Start 请求时间:{}---", dateTimeFormat.format(new Date()));
  61. logger.info("异常信息:{}", ex.getMessage());
  62. logger.info("----AfterThrowing End 请求时间:{}---", dateTimeFormat.format(new Date()));
  63. }
  64.  
  65. /**
  66. * 监控所有@Controller的方法
  67. */
  68. @Pointcut("within(@org.springframework.stereotype.Controller *)")
  69. public void allControllerMethod() {
  70. }
  71.  
  72. @Pointcut("within(@org.springframework.web.bind.annotation.RestController *)")
  73. public void allrestControllerMethod() {
  74. }
  75.  
  76. /**
  77. * Around 手动控制调用核心业务逻辑,以及调用前和调用后的处理,
  78. *
  79. * 注意:当核心业务抛异常后,立即退出,转向afterReturning 执行完afterReturning,再转到AfterThrowing
  80. *
  81. * @param joinPoint
  82. * @return
  83. * @throws Throwable
  84. */
  85. @Around("allControllerMethod()||allrestControllerMethod()")
  86. public Object Around(final ProceedingJoinPoint joinPoint) throws Throwable {
  87. logger.info("----Around Start 请求时间:{}----", dateTimeFormat.format(new Date()));
  88. logger.info("---请求前 beforeMethod");
  89. final Object obj = joinPoint.proceed();
  90. logger.info("---请求后 afterReturning");
  91. logger.info("----Around End 请求时间:{}----", dateTimeFormat.format(new Date()));
  92. return obj;
  93. }
  94.  
  95. /**
  96. * 在核心业务执行前执行。
  97. *
  98. * @param joinPoint
  99. * @throws InterruptedException
  100. */
  101. @Before("allControllerMethod() || allrestControllerMethod()")
  102. public void beforeMethod(final JoinPoint joinPoint) throws InterruptedException {
  103. logger.info("--beforeMethod Start 请求时间:{}--", dateTimeFormat.format(new Date()));
  104. final ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder
  105. .getRequestAttributes();
  106. final HttpServletRequest request = servletRequestAttributes.getRequest();
  107. final String requestUrl = request.getRequestURI().toString();
  108. final int jpsHashCode = joinPoint.getSignature().hashCode();
  109. logger.info("访问序号:{},请求路径:{},访问请求参数对象 : {}", jpsHashCode, requestUrl, Arrays.toString(joinPoint.getArgs()));
  110. logger.info("--beforeMethod End 请求时间:{}--", dateTimeFormat.format(new Date()));
  111. }
  112.  
  113. }

注解实现AOP的更多相关文章

  1. 如何通过自定义注解实现AOP切点定义

    面向切面编程(Aspect Oriented Programming, AOP)是面向对象编程(Object Oriented Programming,OOP)的强大补充,通过横切面注入的方式引入其他 ...

  2. Spring之注解实现aop(面向切面编程)

    1:Aop(aspect object programming)面向切面编程,名词解释:    1.1:功能:让关注点代码与业务逻辑代码分离    1.2:关注点        重复代码就叫做关注点  ...

  3. Spring_Spring与AOP_AspectJ基于注解的AOP实现

    一.AspectJ.Spring与AOP的关系 AspectJ是一个面向切面的框架,它扩展了Java语言.AspectJ定义了AOP语法,所以它有一个专门的编译器用来生成遵守Java字节编码规范的Cl ...

  4. spring学习笔记二 注解及AOP

    本节需要导入spring-aop包 注解 使用注解的目的是为了代替配置,在使用注解时,省略键时,则是为value赋值. 扫描某个包下的所有类中的注解 <?xml version="1. ...

  5. spring中基于注解使用AOP

    本文内容:spring中如何使用注解实现面向切面编程,以及如何使用自定义注解. 一个场景 比如用户登录,每个请求发起之前都会判断用户是否登录,如果每个请求都去判断一次,那就重复地做了很多事情,只要是有 ...

  6. spring-AOP框架(基于AspectJ注解配置AOP)

    基于AspectJ注解配置AOP 1.加入jar包: 要在Spring应用中使用AspectJ注解,必须在classpath下包含AspectJ类库:aopalliance.jar.aspectj.w ...

  7. Spring注解(AOP)

    底层动态代理 程序运行期间动态的将某段代码切入到指定方法指定位置进行运行的编程方式 导入aop的相关模块 <!-- https://mvnrepository.com/artifact/org. ...

  8. spring注解开发-AOP(含原理)

    一:AOP基本使用 AOP指在程序运行期间动态的将某段代码切入到指定方法指定位置进行运行的编程方式: 步骤一:导入aop模块:Spring AOP:(spring-aspects) <depen ...

  9. SpringCloud开发学习总结(六)—— 结合注解的AOP示例

    面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型.利用AOP ...

  10. SpringBoot自定义注解、AOP打印日志

    前言 在SpringBoot中使用自定义注解.aop切面打印web请求日志.主要是想把controller的每个request请求日志收集起来,调用接口.执行时间.返回值这几个重要的信息存储到数据库里 ...

随机推荐

  1. c++多线程基础3(mutex)

    整理自:zh.cppreference.com/w/cpp/thread 互斥锁 互斥算法避免多个线程同时访问共享资源.这会避免数据竞争,并提供线程间的同步支持.定义于头文件 <mutex> ...

  2. Squid系统服务脚本

    #!/bin/bash # chkconfig: - 90 25 #其中-的意思是所有运行级别 # config: /etc/squid.conf # pidfile: /usr/local/squi ...

  3. resultType和resultMap的区别

    1.resultType和resultMap的区别 1>resultType 返回的结果类型 2>resultMap 描述如何将结果集映射到Java对象 2.resultMap节点 1&g ...

  4. CF914E Palindromes in a Tree(点分治)

    link 题目大意:给定一个n个点的树,每个点都有一个字符(a-t,20个字符) 我们称一个路径是神犇的,当这个路径上所有点的字母的某个排列是回文 求出对于每个点,求出经过他的神犇路径的数量 题解: ...

  5. if __name__ == '__main__'是什么意思?如何理解?看到一个很有用的解答

    小明.py 朋友眼中你是小明(__name__ == '小明'), 你自己眼中你是你自己(__name__ == '__main__'), 你编程很好, 朋友调你去帮他写程序(import 小明, 这 ...

  6. scp命令限速远程拷贝

    示例: 限速40M拷贝 scp -rl 358400 expdp_all_3schema_20180427* 172.16.16.36:/data/dmpold/

  7. HDU 6356 (线段树-l,r 之间小于val 的变val+单点求值)

    题目描述: 给你一个长度为n的最开始为0的数以及m个更新操作以及数据生成器参数X,Y,Z.每次操作,将由数据生成器生成出li,ri,vi.让你从区间[li,ri]中,将所有小于vi的数变为vi.最后让 ...

  8. [转] 完全卸载删除gitlab

    [From] https://yq.aliyun.com/articles/114619 完全卸载删除gitlab 1.停止gitlab gitlab-ctl stop 2.卸载gitlab(注意这里 ...

  9. flask之--钩子,异常,上下文,flask-script,模板,过滤器,csrf_token

    一.请求钩子 在客户端和服务器交互的过程中,有些准备工作或扫尾工作需要处理,比如: - 在请求开始时,建立数据库连接: - 在请求开始时,根据需求进行权限校验: - 在请求结束时,指定数据的交互格式: ...

  10. Vue PDF文件预览vue-pdf

       最近做项目,遇到预览PDF这个功能,在网上找了找,大多推荐的是pdf.js,不过在Vue中还是想偷懒直接npm组件,最后找到了一个还不错的Vue-pdf 组件,GitHub地址:https:// ...