1、引入依赖

<!-- 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.46</version>
</dependency>

  

  

2、编写切面类

@Aspect
@Component
public class WebControllerAspact {// 匹配com.zkn.learnspringboot.web.controller包及其子包下的所有类的所有方法,(&&、||、!)用来连接多个条件,例如@Pointcut("execution(* pom.controller..*.*(..)) || execution(* pom.controller..*.*(..))")

     //@Pointcut(value="execution(* pom.controller..*.*(..))" &&!@annotation(com.qding.hk.rest.common.argument.NotAopLog))表示不拦截注解为NotAopLog的方法或者类
     @Pointcut(value="execution(* pom.controller..*.*(..))")public void executeService() {}/*** 前置通知,方法调用前被调用* * @param joinPoint*/@Before("executeService()")public void doBeforeAdvice(JoinPoint joinPoint) {System.out.println("我是前置通知!!!");// 获取目标方法的参数信息Object[] obj = joinPoint.getArgs();// AOP代理类的信息joinPoint.getThis();// 代理的目标对象joinPoint.getTarget();// 用的最多 通知的签名Signature signature = joinPoint.getSignature();// 代理的是哪一个方法System.out.println(signature.getName());// AOP代理类的名字System.out.println(signature.getDeclaringTypeName());// AOP代理类的类(class)信息signature.getDeclaringType();// 获取RequestAttributesRequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();// 从获取RequestAttributes中获取HttpServletRequest的信息HttpServletRequest request = (HttpServletRequest) requestAttributes.resolveReference(RequestAttributes.REFERENCE_REQUEST);// 如果要获取Session信息的话,可以这样写:// HttpSession session = (HttpSession)// requestAttributes.resolveReference(RequestAttributes.REFERENCE_SESSION);Enumeration<String> enumeration = request.getParameterNames();Map<String, String> parameterMap = new HashMap<String, String>();while (enumeration.hasMoreElements()) {String parameter = enumeration.nextElement();parameterMap.put(parameter, request.getParameter(parameter));}String str = JSON.toJSONString(parameterMap);if (obj.length > 0) {System.out.println("请求的参数信息为:" + str);}}/*** 后置返回通知 这里需要注意的是: 如果参数中的第一个参数为JoinPoint,则第二个参数为返回值的信息* 如果参数中的第一个参数不为JoinPoint,则第一个参数为returning中对应的参数 returning* 限定了只有目标方法返回值与通知方法相应参数类型时才能执行后置返回通知,否则不执行,对于returning对应的通知方法参数为Object类型将匹配任何目标返回值* * @param joinPoint* @param keys*/@AfterReturning(value = "execution(* com.example.demo.mvc..*.*(..)) || execution(* com.example.demo.controller..*.*(..))", returning = "keys")public void doAfterReturningAdvice1(JoinPoint joinPoint, Object keys) {System.out.println("第一个后置返回通知的返回值:" + keys);}@AfterReturning(value = "execution(* com.example.demo.mvc..*.*(..)) || execution(* com.example.demo.controller..*.*(..))", returning = "keys", argNames = "keys")public void doAfterReturningAdvice2(String keys) {System.out.println("第二个后置返回通知的返回值:" + keys);}/*** 后置异常通知 定义一个名字,该名字用于匹配通知实现方法的一个参数名,当目标方法抛出异常返回后,将把目标方法抛出的异常传给通知方法; throwing* 限定了只有目标方法抛出的异常与通知方法相应参数异常类型时才能执行后置异常通知,否则不执行,* 对于throwing对应的通知方法参数为Throwable类型将匹配任何异常。* * @param joinPoint* @param exception*/@AfterThrowing(value = "executeService()", throwing = "exception")public void doAfterThrowingAdvice(JoinPoint joinPoint, Throwable exception) {// 目标方法名:System.out.println(joinPoint.getSignature().getName());if (exception instanceof NullPointerException) {System.out.println("发生了空指针异常!!!!!");}}/*** 后置最终通知(目标方法只要执行完了就会执行后置通知方法)* * @param joinPoint*/@After("executeService()")public void doAfterAdvice(JoinPoint joinPoint) {System.out.println("后置通知执行了!!!!");}/*** 环绕通知: 环绕通知非常强大,可以决定目标方法是否执行,什么时候执行,执行时是否需要替换方法参数,执行完毕是否需要替换返回值。* 环绕通知第一个参数必须是org.aspectj.lang.ProceedingJoinPoint类型*/@Around("execution(* com.example.demo.mvc..*.*(..)) || execution(* com.example.demo.controller..*.*(..))")public Object doAroundAdvice(ProceedingJoinPoint proceedingJoinPoint) {System.out.println("环绕通知的目标方法名:" + proceedingJoinPoint.getSignature().getName());try {// obj之前可以写目标方法执行前的逻辑Object obj = proceedingJoinPoint.proceed();// 调用执行目标方法return obj;} catch (Throwable throwable) {throwable.printStackTrace();}return null;}}

  

备注:环绕通知会覆盖异常通知

转载于:https://www.cnblogs.com/lichangyunnianxue/p/9698392.html

springboot-aop相关推荐

  1. 如何使用SpringBoot AOP 记录操作日志、异常日志?

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 作者:咫尺的梦想_w cnblogs.com/wm-dv/ ...

  2. springboot aop + logback + 统一异常处理 打印日志

    springboot aop + logback + 统一异常处理 打印日志 参考文章: (1)springboot aop + logback + 统一异常处理 打印日志 (2)https://ww ...

  3. SpringBoot+AOP实现多数据源动态切换

    SpringBoot+AOP实现多数据源动态切换 背景 设计总体思路 步骤 背景 系统后端需要访问多个数据库,现有的数据库连接配置写入配置文件中.后端需要从一个数据库的配置表里动态的读取其它mysql ...

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

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

  5. Spring-Boot + AOP实现多数据源动态切换

    2019独角兽企业重金招聘Python工程师标准>>> 最近在做保证金余额查询优化,在项目启动时候需要把余额全量加载到本地缓存,因为需要全量查询所有骑手的保证金余额,为了不影响主数据 ...

  6. SpringBoot + AOP 统一处理日志

    Springboot + AOP 统一处理日志.然后系统日志持久化到文件保存起来,当程序方便发生问题的时候,能够快速.准确的定位到问题的所在.SpringBoot + Log4j 每天输出一个日志文件 ...

  7. SpringBoot+AOP构建多数据源的切换实践

    针对微服务架构中常用的设计模块,通常我们都会需要使用到druid作为我们的数据连接池,当架构发生扩展的时候 ,通常面对的数据存储服务器也会渐渐增加,从原本的单库架构逐渐扩展为复杂的多库架构. 当在业务 ...

  8. springboot+aop+自定义注解,打造通用的全局异常处理和参数校验切面(通用版)

    springboot+aop+自定义注解,打造通用的全局异常处理和参数校验切面(通用版) 参考文章: (1)springboot+aop+自定义注解,打造通用的全局异常处理和参数校验切面(通用版) ( ...

  9. SpringBoot+AOP(@Around)

    SpringBoot+AOP(@Around) 虽然SpringBoot很方便,可以使我们不太懂原理的情况下都可以轻松的写出一个CRUD的项目,但是SpringBoot的控制反转和依赖注入我们时时刻刻 ...

  10. springBoot Aop打印日志

    springBoot Aop打印日志 1.类上加@Aspect,@Component注解 2.@Pointcut()定义一个切点,里面填写路径,一般是所有controller中的所有方法,所有的参数 ...

最新文章

  1. Mysql8 group replication组复制集群单主多主模式切换
  2. python grequests极限_Python grequests闲话
  3. 第02讲:夯实根基,Web 网页基础
  4. 注释,无处不在的注释
  5. 卷积神经网络计算题试题_卷积神经网络的计算
  6. TIGK监控平台介绍
  7. mysql dede arctiny_如何用织梦SQL命令行工具操作数据库及常用sql语句整理
  8. iOS:重识Transform和frame
  9. 谷歌称语音识别是下一个机会,尤其在发展中国家
  10. 编写Linux Shell脚本的最佳实践
  11. Mysql重新安装(ubuntu)
  12. Vue项目里面使用jsmind.js插件来制作思维导图页面完成需求
  13. 物联网-智能家居相关知识了解
  14. c++内存分区、创建变量开辟内存
  15. 100项目插件激活程序验证码,自行复制
  16. 测试人真实面试经历:十面阿里,七面头条,六个Offer
  17. java 32位兼容_Java 32位与64位兼容性
  18. 产品经理入门——需求收集
  19. 洛谷P1010 [NOIP1998 普及组] 幂次方题解
  20. Angular 已死,React 已凉,Vue3.0 称王!

热门文章

  1. brew 安装软件能指定文件夹吗_Mac安装homebrew安装到指定目录
  2. 给本地Git配置账号信息
  3. Jenkins系列二通过Deploy war/ear to a container方式部署maven项目,maven聚合项目到Tomcat
  4. 电子相册系统(三)使用技术
  5. [渝粤教育] 云南大学 高级语言程序设计 参考 资料
  6. 【渝粤教育】国家开放大学2018年秋季 0313-22T促销策划与实战 参考试题
  7. 【渝粤教育】国家开放大学2018年秋季 0556-22T广告摄影 参考试题
  8. 图系列(一)图神经网络
  9. 推荐系统000111
  10. 自己的阿里云部署了django发现连不上, 一下是网上查的解决方法,亲测可用