AOP学习(面向切面)

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");
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值