AOP (Aspect Oriented Programming)面向切面编程,一种编程范式,指导开发者如何组织程序结构
OOP (Object Oriented Programming)面向对象编程
作用:在不影响原始设计的基础上为其进行功能增强
Spring理念:无入侵式/无侵入式
连接点(JoinPoint):程序执行过程中的任意位置,粒度为执行方法等,在spring中理解为方法的执行
切入点(Pointcut):匹配连接点的式子,在SpringAOP中,切入点可以描述一个具体方法,也可以匹配多个方法
通知(Advice):在切入点执行的操作,也就是共性功能
切面(Aspect):描述通知与切入点的对应关系
简单案例
AOP工作流程
Spring容器启动 -> 读取所有切面配置(AOP类)中的切入点 -> 初始化bean,匹配失败,创建原始对象(目标对象);匹配成功,创建代理对象
AOP切入点表达式
切入点表达式标准格式:动作关键字(访问修饰符 返回值 包名.类名.接口名/方法名(参数)异常名)
execution(public User com.itheima.service.UserService.findById(int))
*:单个独立的任意字符
..:多个连续的任意字符
+:匹配子类类型
注意事项
- 包名书写尽量不使用..匹配,效率过低,常用*做单个包描述匹配,或精准匹配
- 接口名/类名书写名称与模块相关的采用*匹配,例如UserService书写成*Service,绑定业务层接口名
- 方法名书写以动词进行精准匹配,名词采用*匹配,例如getById书写成getBy*,selectAll书写成selectAll
AOP通知
前置通知 @Before("切入点方法名")
后置通知 @After("切入点方法名")
环绕通知 @Around("切入点方法名")
返回后通知 @AfterReturning("切入点方法名")
抛出异常后通知 @AfterThrowing("切入点方法名")
AOP通知获取数据
获取切入点方法的参数 JoinPoint:适用于前置、后置、返回后、抛出异常后通知 ProceedJointPoint:适用于环绕通知
获取切入点方法返回值 返回后通知 环绕通知
获取切入点方法运行异常信息 抛出异常后通知 环绕通知
参考文章
https://www.cnblogs.com/jap6/p/10637429.html springAOP中用joinpoint获取切入点方法的参数
https://blog.csdn.net/q982151756/article/details/80513340 细说Spring——AOP详解(AOP概览)