当前位置: 首页 > news >正文

一文了解SpringBoot中的Aop

目录

1.什么是Aop

2.相关概念

3.相关注解

4.为什么要用Aop

5.Aop使用案例


1.什么是Aop

AOP:Aspect Oriented Programming,面向切面,是Spring三大思想之一,另外两个是

IOC-控制反转

DI-依赖注入 (@Autowired、@Qualifier、@Resource)

2.相关概念

  • 切面(aspect):横切面对象,一般为一个具体类对象(可以借助@Aspect声明),可以理解为要植入的新的业务功能,这个功能交给某个类负责,这个类就是切面。
  • 切入点(pointcut):对连接点拦截内容的一种定义,在原有的哪些业务方法上扩展新的业务,可以将切入点理解为方法的集合,可以是1个类或某些类。
  • 连接点(joinpoint):程序执行过程中某个特定的点,一般指被拦截到的的方法,可以简单理解为切入点中的一个具体方法。
  • 通知(advice):拦截到连接点之后只要执行的方法,可以理解为一个业务中的扩展逻辑的若干步骤,先做什么(before),再做什么(afterReturn),最后做什么。
  • 目标对象(target):封装原业务逻辑的对象。
  • 代理对象(proxy):负责调用切面中的方法为目标对象植入新的功能。

3.相关注解

@Pointcut定义切入点
@Before目标方法执行之前执行
@After目标方法执行之后必定执行,无论是否报错
@AfterReturning目标方法有返回值且正常返回后执行
@AfterThrowing目标方法抛出异常后执行
@Around可以获取到目标方法的入参和返回值

4.为什么要用Aop

举个例子,假设我们有一个新增数据,和一个删除数据的功能。

可能之前的逻辑是

开始->鉴权->新增数据->记录操作日志->结束

开始->鉴权->删除数据->记录操作日志->结束

借助Aop,我们就可以实现

另外,在以下场景也可以借助Aop

系统日志处理、系统事务处理、系统安全验证、系统数据缓存等

5.Aop使用案例

先看一个简单的例子,就是通过execution表达式来定义某个包小的所有方法为切入点

第一个 * 符号表示返回值的类型任意
com.aop.service即需要进行横切的业务包
包名后面的 .*表示当前包下面的类
.*(..)表示任何方法名,括号表示参数,两个点表示任何参数类型
@Aspect
@Component
@Slf4j
@Order(10)
public class AopAdvice {@Before("execution (* com.erich.yand.service.console.day.end.*.*(..))")public void beforeAdvice() {log.info("beforeAdvice...");}@After("execution (* com.erich.yand.service.console.day.end.*.*(..))")public void afterAdvice() {log.info("afterAdvice...");}@Around("execution (* com.erich.yand.service.console.day.end.*.*(..))")public void aroundAdvice(ProceedingJoinPoint proceedingJoinPoint) {log.info("before");try {proceedingJoinPoint.proceed();} catch (Throwable t) {t.printStackTrace();}log.info("after");}
}

当有多个切面时,Order越小越先执行。

执行后,可以看到结果

 说明执行到我们定义的包下的方法时,确实切进来了~~

以上就是Aop的一个简单案例了,具体如何使用他,还需要根据实际的业务场景来拓展~~

http://www.lryc.cn/news/142773.html

相关文章:

  • android系统启动流程之zygote如何创建SystemServer进程
  • 【awd系列】Bugku S3 AWD排位赛-9 pwn类型
  • vcomp140.dll丢失的修复方法分享,电脑提示vcomp140.dll丢失修复方法
  • Docker file解析
  • 工作与身体健康之间的平衡
  • 算法和数据结构
  • 商城-学习整理-集群-K8S-集群环境部署(二十四)
  • 利用多种机器学习方法对爬取到的谷歌趋势某个关键词的每日搜索次数进行学习
  • ARL资产侦察灯塔 指纹增强
  • javaee spring 自动注入,如果满足条件的类有多个如何区别
  • sql语句中的ddl和dml
  • 学习JAVA打卡第四十一天
  • leetcode SQL题目
  • 计算机组成原理学习笔记-精简复习版
  • 聊一聊微前端框架的选型和实现 | 业务平台
  • Elasticsearch 集成---框架集成SpringData-集成测试-索引操作
  • 将Series序列中的缺失值用后一个值填充Series.bfill()
  • 用香港服务器域名需要备案吗?
  • 【项目经理】项目管理杂谈
  • 【算法总结篇】 笔面试常见题目
  • Java基础 数据结构一【栈、队列】
  • Spark on Yarn集群模式搭建及测试
  • vue 简单实验 v-on html事件绑定
  • c#设计模式-创建型模式 之 原型模式
  • 运放的分类、运放的参数
  • 手写数字识别之优化算法:观察Loss下降的情况判断合理的学习率
  • 软件工程(二十) 系统运行与软件维护
  • 蓝蓝设计ui设计公司作品--泛亚高科-光伏电站控制系统界面设计
  • 软考高级系统架构设计师系列论文七十:论信息系统的安全体系
  • ​Softing dataFEED OPC Suite——助力数字孪生技术发展