Spring——AOP切入点表达式和AOP通知类型

切入点:要进行增强的方法

切入点表达式:要进行增强的方法的描述式

 第一种方法的本质是基于接口实现的动态代理(jdk)

第二种是基于cglib实现的动态代理

AOP切入点表达式

而需要加载多个切入点时,不可能每个切入点都写一个切入点表达式

例子

下面的代理描述的是匹配任意返回值的(第一个*) ,org.example包下的任意包下的任意以service结尾的类或接口下的,以find开头的任意方法,参数任意。

也就是给业务层下的所有查询方法加上AOP,比如findByid,findAll,findBy...

  @Pointcut("execution(* org.example.*.*service.find*(..))")
    public void pts(){}

 

AOP通知类型  

在目标对象中定义两个方法 

在通知类中定义五个方法演示上面五种通知类型

package org.example.aop;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;


@Component
@Aspect
public class MyAdvice {

    /*@Pointcut("execution(void org.example.dao.BookDao.save())")
    public void ptx(){}*/

    @Pointcut("execution(void org.example.dao.BookDao.update())")
    public void pt(){}
    @Pointcut("execution(int org.example.dao.BookDao.select())")
    public void pts(){}

  /*  @Before("pt()")
    public void before(){
        System.out.println("before advice...");
    }*/
  /*  @After("pt()")
    public void after(){
        System.out.println("after advice...");
    }*/
/*    @Around("pts()")
    public Object around(ProceedingJoinPoint pjp) throws Throwable {
        System.out.println("before advice...");
       Object ret= pjp.proceed();
        System.out.println("after advice...");
        return ret;
    }*/

/*    @AfterReturning("pts()")
    public void afterReturning(){
        System.out.println("afterReturning advice...");
    }*/
    @AfterThrowing("pts()")
    public void afterThrowing(){
        System.out.println("afterThrowing advice...");
    }
}

 前置通知:

后置通知: 

环绕通知(无返回值):

原始方法的输出直接被吞了

 在这个通知中需要告诉它原始操作需要放在哪个位置,下面的pjp.proceed()表示的就是对原始操作的调用。需要抛出一个异常

@Around("pt()")
    public void around(ProceedingJoinPoint pjp) throws Throwable {
        System.out.println("before advice...");
        pjp.proceed();
        System.out.println("after advice...");
    }

 环绕通知(有返回值):

使用如图的环绕通知调用一个有返回值的方式时会报错。

 

原因是环绕通知的方法也要有返回值,但是返回值类型应该写Object,因为不能确定所有的原始方法返回值相同。

在下面的环绕通知中,原始方法的reutrn被拦截了,需要这个通知再进行return

 上面这个才是标准写法,不管返回值是不是void

返回后通知:

和上面的后置通知很像,但是这个是在返回之后才通知,如何在返回前有个异常导致没有正常返回就不会执行通知,比如在select()中 

输出如下 

 异常后通知:

只会在抛出异常后运行,还是上面的1/0,输出如下

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值