简单来说讲,动态地将代码切入到类的指定方法、指定位置上的编程思想就是面向切面的编程。

目录
  • AOP几个术语
  • AOP Demo
    • 引入Maven依赖
    • 一个简单的Controller
    • 定义切面类
    • 调用服务
    • 切点表达式
    • 环绕通知

AOP几个术语


  1. 切面

切面是通知和切点的结合。通知和切点共同定义了切面的全部内容——它是什么,在何时和何处完成其功能。比如事务管理是一个切面,权限管理也是一个切面。

  1. 通知

通知定义了切面是什么以及何时使用。
Spring切面中定义了5个通知类型:
* 前置通知:在目标方法调用之前执行
* 后置通知:在目标方法调用之后执行
* 返回通知:在目标方法成功执行之后执行
* 异常通知:在目标方法抛出异常之后执行
* 环绕通知:通知包裹了方法,可同时定义前置和后置通知。

  1. 切点

切点定义了在何处工作,也就是在那个方法应用通知。

  1. 连接点

连接点是在应用执行过程中能够插入切面的一个点。这个点可以是调用方法时,抛出异常时,甚至修改一个字段时。切面代码可以利用这些点插入到应用的正常流程之中,并添加新的行为

  1. 引入

引入让一个切面可以声明被通知的对象实现了任何他们没有真正实现的额外接口,而且为这些对象提供接口的实现。
引入允许我们向现有的类添加新方法或属性。这个新方法和实例变量就可以被引入到现有的类中,从而可以再无需修改这些现有的类的情况下,让它们具有新的行为和状态。

  1. 织入

织入是把切面应用到目标对象并创建新的代理对象的过程。切面在指定的连接点被织入到目标对象中。在目标对象的生命周期里有多个点可以织入。

AOP Demo


下面是一个小Demo

引入Maven依赖

<!--引入SpringBoot的Web模块-->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency><!--引入AOP依赖-->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId>
</dependency>

一个简单的Controller

package com.example.demo.aop;import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;/**
* @desc: 核心业务模块
* @author: CSH
**/
@RestController
@RequestMapping("/aopController")
public class AopController {@RequestMapping(value = "/Curry")public void Curry(){System.out.println("库里上场打球了!!");}@RequestMapping(value = "/Harden")public void Harden(){System.out.println("哈登上场打球了!!");}@RequestMapping(value = "/Antetokounmpo")public void Antetokounmpo(){System.out.println("字母哥上场打球了!!");}@RequestMapping(value = "/Jokic")public void Jokic(){System.out.println("约基奇上场打球了!!");}@RequestMapping(value = "/Durant/{point}")public void Durant(@PathVariable("point")  int point){System.out.println("杜兰特上场打球了!!");}
}

定义切面类

在类上添加@Aspect 和@Component 注解即可将一个类定义为切面类。

@Aspect 注解 使之成为切面类
@Component 注解 把切面类加入到IOC容器中

package com.example.demo.aop;import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;/**
* @desc: 经纪人切面
* @author: CSH
**/
@Aspect
@Component
public class BrokerAspect {/*** 定义切入点,切入点为com.example.demo.aop.AopController中的所有函数*通过@Pointcut注解声明频繁使用的切点表达式*/@Pointcut("execution(public * com.example.demo.aop.AopController.*(..)))")public void BrokerAspect(){}/*** @description  在连接点执行之前执行的通知*/@Before("BrokerAspect()")public void doBeforeGame(){System.out.println("经纪人正在处理球星赛前事务!");}/*** @description  在连接点执行之后执行的通知(返回通知和异常通知的异常)*/@After("BrokerAspect()")public void doAfterGame(){System.out.println("经纪人为球星表现疯狂鼓掌!");}/*** @description  在连接点执行之后执行的通知(返回通知)*/@AfterReturning("BrokerAspect()")public void doAfterReturningGame(){System.out.println("返回通知:经纪人为球星表现疯狂鼓掌!");}/*** @description  在连接点执行之后执行的通知(异常通知)*/@AfterThrowing("BrokerAspect()")public void doAfterThrowingGame(){System.out.println("异常通知:球迷要求退票!");}
}

上面前置通知后置通知等都需要配置到定义的切点上。可以定义好多个切点@Pointcut

调用服务

调用http://localhost:8080/aopController/Harden,输出结果:

切点表达式

参考文章

环绕通知

Spring中使用次数最多的是环绕通知,

/**
* @description  使用环绕通知
*/
@Around("BrokerAspect()")
public void doAroundGame(ProceedingJoinPoint pjp) throws Throwable {try{System.out.println("经纪人正在处理球星赛前事务!");pjp.proceed();System.out.println("返回通知:经纪人为球星表现疯狂鼓掌!");}catch(Throwable e){System.out.println("异常通知:球迷要求退票!");}
}

环绕通知接收一个ProceedingJoinPoint参数,可以用他来调用被通知方法,当调用proceed()方法之前,环绕通知可以做任何操作,控制权在环绕通知中,在调用proceed()方法之后,控制权返回被通知方法,被通知方法执行结束之后,控制权返回到环绕通知手中,继续执行后续操作。如果不调用proceed()方法,则被通知方法会被一直阻塞,一直不会执行,多用于权限验证。

当需要传递参数时:

package com.example.demo.aop;import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;/**
* @desc:技术统计
* @author: CSH
**/
@Aspect
@Component
public class GameDataAspect {/*** 定义切入点,切入点为com.example.demo.aop.AopController中的所有函数*通过@Pointcut注解声明频繁使用的切点表达式*/@Pointcut("execution(public * com.example.demo.aop.AopController.Durant(int)) && args(point))")public void GameDataAspect(int point){}/*** @description  使用环绕通知*/@Around("GameDataAspect(point)")public void doAroundGameData(ProceedingJoinPoint pjp,int point) throws Throwable {try{System.out.println("球星上场前热身!");pjp.proceed();System.out.println("球星本场得到" + point + "分" );}catch(Throwable e){System.out.println("异常通知:球迷要求退票!");}}
}

参考文章:https://www.cnblogs.com/LemonFive/p/10983875.html

Spring Boot AOP的使用相关推荐

  1. Spring Boot AOP处理方法的入参和返回值

    前言 IOC和AOP是Spring 中最重要的两个模块.这里练习一下如何使用Spring Boot AOP处理方法的入参和返回值. Spring AOP的简单介绍: AOP(Aspect-Orient ...

  2. Spring Boot————AOP入门案例及切面优先级设置

    看了这篇文章,如果你还是不会用AOP来写程序,请你打我!! =.=||| 引言 Spring AOP是一个对AOP原理的一种实现方式,另外还有其他的AOP实现如AspectJ等. AOP意为面向切面编 ...

  3. Spring boot AOP(切面)使用方法和解析

    最近开始实习,终于有时间写博客了.因为需要使用springboot,大三学Oracle数据库的时候使用过springboot,之前没怎么用java写网页后台,发现网上很多的博客要不就是复制粘贴,要不就 ...

  4. Spring Boot AOP 扫盲,实现接口访问的统一日志记录

    AOP 是 Spring 体系中非常重要的两个概念之一(另外一个是 IoC),今天这篇文章就来带大家通过实战的方式,在编程猫 SpringBoot 项目中使用 AOP 技术为 controller 层 ...

  5. spring boot aop 记录方法执行时间

    了性能调优,需要先统计出来每个方法的执行时间,直接在方法前后log输出太麻烦,可以用AOP来加入时间统计 添加依赖 <dependency> <groupId>org.spri ...

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

    1 AOP AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软件开发 ...

  7. Spring Boot AOP记录用户操作日志

    一.引入必要依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId> ...

  8. Spring Boot Aop结合Swagger记录用户操作日志

    1.引入依赖 <dependency><groupId>io.springfox</groupId><artifactId>springfox-swag ...

  9. Spring Boot + Aop 记录用户操作日志

    目录 一.前言 二.实战 1.设计用户操作日志表: sys_oper_log 2.引入依赖 3.自定义用户操作日志注解 4.自定义用户操作日志切面 5.MyLog注解的使用 6.最终效果 三.总结 一 ...

最新文章

  1. 华科提出目标检测新方法:基于IoU-aware的定位改进,简单又有效
  2. 3D点云识别安全吗? 密歇根大学等提出稳健性分析数据集应对严重失真
  3. Mysql5.5配置主从复制
  4. python查看安装包的版本scipy,numpy,matplotlib等
  5. 正则表达式的比较JDK1.4 vs jakarta
  6. CentOS 7下的MariaDB Master-Slave Replication配置
  7. 小型动漫知识图谱的构建 (Python+Neo4j) (纯实践内容,基于bilibili所有正版番剧的动漫、声优、角色、类型)
  8. dalsa工业相机8k参数_工业传感器再掀巨浪 | Teledyne 以80亿美元收购FLIR,互补性产品组合又增体量...
  9. [js] 获取浏览器当前页面的滚动条高度的兼容写法
  10. trunk vlan 加路由
  11. Remark for Color-Spectrum Rendering
  12. 上传excel,并保存excel内容
  13. 基于JAVA的私人牙科诊所管理系统
  14. 面试官问你的缺点是什么,这么回答漂亮!
  15. 非线性规划模型、0-1整数规划模型
  16. 流水线-流水线相关计算
  17. JS实现多线程--Concurrent.Thread.js
  18. springboot自动创建Oracle,一键生成项目 SpringBoot项目代码生成器 支持Oracle 支持MySql...
  19. VMWare Workstation 7.1 官方英文原版 + 有效密钥 + 汉化补丁
  20. ZOJ 2212 Argus

热门文章

  1. vue 地图使用navigator_初识ABP vNext(6):vue+ABP实现国际化
  2. android 手机内存uri_Android消息机制Handler原理解析
  3. linux能上ps吗,在linux上使用ps(转载)
  4. AndroidL 开机展示Keyguard锁屏机制初探
  5. 企业分布式微服务云SpringCloud SpringBoot mybatis (十二)断路器监控(Hystrix Dashboard)...
  6. php树形结构数组转化
  7. vue组件样式scoped
  8. 两款新iPhoneX终于要开始生产了,网友的反应却出人意料
  9. 网络爬虫随记:2018-03-12启(refreshing)
  10. vscode配置python 控制台/终端/TERMINAL 不输出/不显示 解决办法