AOP学习
AOP概述:
面向切面的程序设计程序(AOP)补充了面向对象程序设计程序(OOP)
aop 术语:
Aspect
切面:切面是通知和切点的结合
Join point
连接点:连接点表示应用执行过程中能够插入切面的一个方法
Advice
通知:AOP 框架中的增强处理
Pointcut
切入点:可以插入增强处理的连接点
Introduction
引入:引入允许我们向现有的类添加新的方法或者属性
Target object
目标对象:通过一个或多个方面代理的对象。也称为“被建议的对象”。由于 springaop 是使用运行时代理实现的,因此该对象始终是一个代理对象
AOP proxy
AOP代理: AOP 框架为了实现切面的方法执行而创建的对象(建议方法执行等等)。在 Spring 框架中,AOP 代理是 JDK 动态代
理或 CGLIB 代理
。
Weaving
织入:将增强处理添加到目标对象中,并创建一个被增强的对象,这个过程就是织入。
AOP通知类型:
通知 | 对应注解 | 说明 |
---|---|---|
Before dvice | @Before | 前置通知:在连接点之前运行的 Advice |
After turning advice | @AfterReturning | 后置返回通知:通知将在连接点正常完成后运行 |
After throwing advice | @AfterThrowing | 异常通知:通知在方法退出时通过抛出异常来运行 |
After (finally) advice | @After | 最终通知:无论连接点通过何种方式退出(正常或异常返回) ,通知都要运行 |
Around advice | @Around | 环绕通知:在方法调用之前和之后,通知可以执行自定义行为。它还负责选择是继续到连接点,还是通过返回自己的返回值或抛出异常来缩短被通知方法的执行 |
切入点表达式:
@Pointcut(“execution(切入点表达式 )”)
表达式格式:
execution(annotation? modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern) throws-pattern?)
annotation :指定方法上有某一个注解
modifiers-pattern:方法修饰符
ret-type-pattern:返回值匹配, 可以为*表示任何返回值,全路径的类名等
declaring-type-pattern:类路径匹配
name-pattern:方法名匹配,可以指定方法名 或者 *代表所有
param-pattern:参数匹配, 可以指定具体的参数类型,多个参数间用
,
英文状态下逗号隔开,各个参数也可以用*
来表示匹配任意类型的参数,throws-pattern:异常类型匹配
其中后面跟着
?
的是可选项
AOP使用:
0:
引入依赖
:<!--切面依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> <version>2.4.4</version> </dependency>
1.在主启动类加入启用AOP注解
@EnableAspectJAutoProxy
2.配置切面类
@Component //将该类交给spring来管理 @Aspect //表示这是一个切面类 public class AopLog { //TODO }
3.配置切入点:
@Component //将该类交给spring来管理 @Aspect //表示这是一个切面类 public class AopLog { /** * 配置切入点 * 表示com.hn.y.controller包下的所有类的所有方法 */ @Pointcut("execution(* com.hn.y.controller.*.*(..))") public void commontCutMethod(){} }
4.配置通知
@Component //将该类交给spring来管理 @Aspect //表示这是一个切面类 public class AopLog { /** * 配置切入点 * 表示com.hn.y.controller包下的所有类的所有方法 */ @Pointcut("execution(* com.hn.y.controller.*.*(..))") public void commontCutMethod(){} /** * 环绕通知 */ @Around(value = "commontCutMethod()") public void Around(ProceedingJoinPoint joinpoint) { System.out.println("Around advice"); } /** * 后置通知 */ @After(value = "commontCutMethod()") public void after(){ System.out.println("after advice"); } /** * 前置通知 */ @Before(value = "commontCutMethod()") public void Before(){ System.out.println("Before advice"); } /** * 最终通知 */ @AfterReturning(value = "commontCutMethod()") public void AfterReturning(){ System.out.println("AfterReturning advice"); } /** * 异常通知 */ @AfterThrowing(value = "commontCutMethod()") public void AfterThrowing(){ System.out.println("AfterThrowing advice"); } }