AOP(切面编程)基础知识

本文介绍了AOP(切面编程)的基础知识,包括切入点的概念,它允许通过名称重用切入点表达式。切入点表达式是匹配方法的规则,可以使用@Pointcut注解定义。此外,文章详细讲解了不同类型的增强处理方法,如前置通知、后置通知、返回后通知、环绕通知和异常通知,解释了它们在连接点执行时的不同行为。

1. 切入点,其实质就是为一个切入点表达式起一个名称,从而允许在多个增强处理中重用该名称。一个切入点表达式:用于指定切入点和哪些方法进行匹配,一个包含名字和任意参数的方法签名:将作为切入点的名称, 在@AspectJ风格的AOP中,切入点签名采用一个普通的方法定义(方法体通常为空)来提供(方法名即为切点名),且该方法的返回值必须为void,切入点表达式需使用@Pointcut注解来标注。下面的代码片段定义了一个切入点。

//定义切点,注解作为切入点(常用自定义注解)
    @Pointcut("@annotation(com.qcby.demo.proxyaop.aop.ViewRecords)")
    //com.qcby.demo.proxyaop.aop.ViewRecords注解路径
    public void viewRecordsPoinCut() {
        
  }

或者

  //定义切点,对应路径作为切入点
    @Pointcut("execution(public * com.qcby.demo.proxyaop.controller..*.*(..))")
    //public * com.qcby.demo.proxyaop.controller..*.*(..))第一个* 代表返回值,第二个*
    //代表类,第三个*代表方法名,(..)代表入参
    public void viewRecordsPoinCut() {

    }

2访问目标方法最简单的做法是定义增强处理方法时,将第一个参数定义为JoinPoint类型,当该增强处理方法被调用时,该JoinPoint参数就代表了织入增强处理的连接点。JoinPoint里包含了如下几个常用的方法:

Object[] getArgs:返回目标方法的参数

Signature getSignature:返回目标方法的签名

Object getTarget:返回被织入增强处理的目标对象

Object getThis:返回AOP框架为目标对象生成的代理对象

    注意:当使用@Around处理时,我们需要将第一个参数定义为ProceedingJoinPoint类型,该类是JoinPoint的子类。

ProceedingJoinPoint对象是JoinPoint的子接口,该对象只用在@Around的切面方法中, 

添加了 Object proceed() throws Throwable //执行目标方法 

Object proceed(Object[] var1) throws Throwable //传入的新的参数去执行目标方法 

3.

前置通知(Before Advice)

在某连接点(JoinPoint)之前执行的通知,但这个通知不能阻止连接点前的执行。例如,TestAspect 中的 doBefore 方法。

后置通知(After Advice)

当某连接点退出的时候执行的通知(不论是正常返回还是异常退出)。

例如,ServiceAspect 中的 returnAfter 方法,所以 Teser 中调用 UserService.delete 抛出异常时,returnAfter 方法仍然执行。

返回后通知(After Return Advice)

在某连接点正常完成后执行的通知,不包括抛出异常的情况。

环绕通知(Around Advice)

包围一个连接点的通知,类似 Web 中 Servlet 规范中的 Filter 的 doFilter 方法。可 以在方法的调用前后完成自定义的行为, 也可以选择不执行。

例如,ServiceAspect 中的 around 方法。

异常通知(After Throwing Advice)

在 方 法 抛 出 异 常 退 出 时 执 行 的 通 知 。

//这样定义
@After("viewRecordsPoinCut()")
//切入点定义的viewRecordsPoinCut()
public void after(JoinPoint joinPoint) throws Throwable {
    
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值