1 AOP

AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

支持5种类型的通知注解:
(1)@Before:前置通知,在方法执行之前返回
(2)@After:后置通知,在方法执行后执行
(3)@AfterRunning:返回通知,在方法返回结果之后执行
(4)@AfterThrowing:异常通知,在方法抛出异常之后
(5)@Around:环绕通知,围绕着方法执行

2 Maven依赖

        <!-- SpringBoot 拦截器 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency><!--hutool工具包--><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.5.1</version></dependency>

3 TestAnnotation

测试注解。

package com.annotation;import java.lang.annotation.*;/*** 测试注解*/
@Inherited
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface TestAnnotation {
}

4 TestAspect

测试切面。

package com.aspect;import cn.hutool.core.date.DateUtil;
import org.aspectj.lang.*;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;import java.util.*;/*** 测试切面*/
@Aspect
@Component
public class TestAspect {/*** 指定切面的切入点*/@Pointcut("@annotation(com.annotation.TestAnnotation)")public void pointcutAnnotation() {}/*** 前置通知:执行目标方法前 触发*/@Before(value = "pointcutAnnotation()")public void methodBefore(JoinPoint joinPoint) {String methodName = joinPoint.getSignature().getName();System.out.println("[" + DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss")+ "]前置通知:方法名:" + methodName + ",参数" + Arrays.asList(joinPoint.getArgs()));}/*** 后置通知:执行目标方法后触发*/@After(value = "pointcutAnnotation()")public void methodAfter(JoinPoint joinPoint) {String methodName = joinPoint.getSignature().getName();System.out.println("[" + DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss")+ "]后置通知:方法名:" + methodName + ",参数" + Arrays.asList(joinPoint.getArgs()));}/*** 返回通知:目标方法执行完并返回参数后触发。*/@AfterReturning(value = "pointcutAnnotation()", returning = "result")public void methodAfterReturning(JoinPoint joinPoint, Object result) {String methodName = joinPoint.getSignature().getName();System.out.println("[" + DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss")+ "]返回通知:方法名:" + methodName + "," +"参数" + Arrays.asList(joinPoint.getArgs()) + "," +"返回结果:");if (result instanceof String[]) {Arrays.stream((String[]) result).forEach(System.out::println);} else {System.out.println(result);}}/*** 异常通知:目标方法抛出异常后触发*/@AfterThrowing(value = "pointcutAnnotation()", throwing="ex")public void methodExceptionOccurred(JoinPoint joinPoint, Exception ex) {String methodName = joinPoint.getSignature().getName();System.out.println("[" + DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss")+ "]异常通知:方法名:" + methodName + ",参数" + Arrays.asList(joinPoint.getArgs()) + ",异常信息:" + ex.getMessage());}/*** 环绕通知,围绕着方法执行* 环绕通知需要携带ProceedingJoinPoint类型的参数* 环绕通知类似于动态代理的全过程:ProceedingJoinPoint类型的参数可以决定是否执行目标方法。* 而且环绕通知必须有返回值,返回值即为目标方法的返回值*/@Around(value = "pointcutAnnotation()")public Object methodAround(ProceedingJoinPoint proceedingJoinPoint) {Object result = null;String methodName = proceedingJoinPoint.getSignature().getName();System.out.println("[" + DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss")+ "]环绕通知:方法名:" + methodName + ",参数" + Arrays.asList(proceedingJoinPoint.getArgs()));//执行目标方法try {result = proceedingJoinPoint.proceed();} catch (Throwable e) {throw new RuntimeException(e);}return result;}}

5 AspectController

调试代码。

package com.controller;import cn.hutool.core.util.StrUtil;
import com.annotation.TestAnnotation;
import org.springframework.web.bind.annotation.*;@RestController
@RequestMapping("/aspect")
public class AspectController {/*** 测试切面** @param key* @return*/@GetMapping("/testAspect")@TestAnnotationpublic String testAspect(@RequestParam String key) throws Exception {if(StrUtil.isBlank(key)){throw new Exception("参数为空");}return key;}
}

6 调试结果

正常情况:

报异常情况:

Spring Boot AOP面向切面编程使用(定义切入点、前置通知、后置通知、返回通知、异常通知、环绕通知)相关推荐

  1. Spring(十八):Spring AOP(二):通知(前置、后置、返回、异常、环绕)

    AspectJ支持5种类型的通知注解: @Before:前置通知,在方法执行之前执行: @After:后置通知,在方法执行之后执行: @AfterRunning:返回通知,在方法返回结果之后执行(因此 ...

  2. spring中AOP(面向切面编程)

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

  3. 【SSM】Spring系列——AOP面向切面编程

    文章目录 03 AOP面向切面编程 3.1 AOP概述 3.2 面向切面编程对有什么好处 3.3 模拟AOP框架实现 3.3.1 代码实现版本一 3.3.2 代码实现版本二 3.3.3 代码实现版本三 ...

  4. 大数据WEB阶段Spring框架 AOP面向切面编程(一)

    Spring - AOP面向切面编程(一) 一.代理模式概述 代理的特点:(目标对象即被代理者) 实现和目标对象相同的接口 具备和目标对象的方法 代理者不仅要做目标对象的方法 , 还要做一些额外的操作 ...

  5. 大数据WEB阶段Spring框架 AOP面向切面编程(二)

    Spring AOP面向切面编程(二) 一.切入点的execution表达式 execution的表达形式: execution(修饰符? 返回值类型 所在包类? 方法名(参数列表) 异常?) ?表示 ...

  6. Spring框架 AOP面向切面编程(转)

    一.前言 在以前的项目中,很少去关注spring aop的具体实现与理论,只是简单了解了一下什么是aop具体怎么用,看到了一篇博文写得还不错,就转载来学习一下,博文地址:http://www.cnbl ...

  7. Spring的AOP面向切面编程

    什么是AOP? 1.AOP概念介绍 所谓AOP,即Aspect orientied program,就是面向方面(切面)的编程. 功能: 让关注点代码与业务代码分离! 关注点: 重复代码就叫做关注点: ...

  8. Spring之AOP(面向切面编程)_入门Demo

    AOP是OOP的延续,是Aspect Oriented Programming的缩写,意思是面向切面编程.AOP实际是GoF设计模式的延续,设计模式孜孜不倦追求的是调用者和被调用者之间的解耦,AOP可 ...

  9. 【Spring】AOP面向切面编程(Spring4和Spring5区别)

    AOP 1. 什么是AOP 2. AOP常用注解 3.Spring4各种通知的执行节点 4. 在aop中校验不通过如何不让程序进入核心代码? 5. 同一个方法被多个Aspect类拦截 5.1 如何指定 ...

最新文章

  1. Hi3531与Hi3520 GPIO口的对比及驱动的修改
  2. 微软发布 Windows 10 预览版 Build 21343:此电脑和回收站等启用全新图标
  3. 程序猿的双十一最佳攻略
  4. 判断请求来自手机还是PC
  5. 不学网php,php不学框架可以吗
  6. 三种实例化bean方式——Spring对bean的管理(一)
  7. 深入浅出数据分析:寻找最大值Solver
  8. iOS怎么做性能测试,看完这个你就懂了
  9. 最拼命最努力的时候(转)
  10. 三维重建 - Clion打包C++代码(包含qt库,opencv以及dcmtk)
  11. 谈谈 WiFi STBC
  12. python之excel编程
  13. Elastic:使用 Elastic Stack 来监督系统日志及指标
  14. mysql-8.0.21-winx64 安装
  15. 手机通过QQ发送图片到电脑端,电脑接收不到且显示图裂
  16. 关于IT公司招聘的一个思考
  17. 教程一:微信公众号的申请
  18. spark原理之一张图搞定broadcast
  19. 使用jTessBoxEditorFX-2.2.0制作自己的字库
  20. 去大厂面试又栽了,败在了算法的理论面试...

热门文章

  1. git pull 提示错误 fatal: refusing to merge unrelated histories
  2. 网络安全:DOM型XSS
  3. memcpy与strcpy的实现与区别
  4. nginx 访问状态统计 访问控制 虚拟主机
  5. celeste第二章_蔚蓝_第二章_初露锋芒_免费小说阅读_飞卢小说网
  6. 2019年定义区块链领域的7个法律问题(下篇)
  7. 浏览器配置存在问题。。360断网急救箱未能修复
  8. 锁定计算机黑屏怎么办,win10锁定屏幕就黑屏怎么办_win10电脑锁定了黑屏怎么办...
  9. 心理危机干预系统简介
  10. 途牛:一直被唱衰,就是没倒下