SpringFrameworkAOP(五)

Spring AOP 通知(一)

通知的五种类型

定义通知

@Aspect
public class AspectsTest {
	//这里为通知:前置通知
    @Before(...)
    public void aopBeforeTest(){
    	//这里面编写的就是通知的内容
    }
}
准备

目标方法的接口

public interface IAop {
    void testAop();
}

目标接口的实现

@Component
public class AopImpl implements IAop {
    public void testAop() {
        System.out.println("invoke AopImpl testAop method");
        //throw new NullPointerException();
    }
}

定义切面

@Aspect
@Component
public class AopTest {
}

测试代码

public class Test {
    private ApplicationContext ap;

    {
        ap = new AnnotationConfigApplicationContext(SpringConfig.class);
    }

    @Test
    public void test01(){
        IAop aopImpl = ap.getBean("aopImpl", AopImpl.class);
        aopImpl.testAop();
    }
}
前置通知:Before

在目标方法前调用

在切面中添加切点和通知

//@Before为前置通知
@Before("execution(* com.test.aop.IAop.testAop(..))")
    public void aopBefore(){
        System.out.println("invoke AopTest aopBefore method");
    }

执行后的结果

在这里插入图片描述

后置通知:After

在目标方法后调用

继续在切面中添加后置通知

//@After为后置通知
@After("execution(* com.test.aop.IAop.testAop(..))")
    public void aopAfter(){
        System.out.println("invoke AopTest aopAfter medthod");
    }

执行结果

在这里插入图片描述

返回通知:AfterReturning

在目标方法执行成功后执行

及目标方法无异常则执行该通知

继续在切面中添加返回通知

//@AfterReturning为返回通知
@AfterReturning("execution(* com.test.aop.IAop.testAop(..))")
    public void aopAfterreturning(){
        System.out.println("invoke AopTest aopAfterreturning medthod");
    }

添加异常

//打开AopImpl中抛出的异常
throw new NullPointerException();

抛出异常后结果

在这里插入图片描述

关闭异常后执行结果

在这里插入图片描述

异常通知:AfterThrowing

在目标方法抛出异常后执行

继续在切面中添加异常通知

//@AfterThrowing为异常通知
@AfterThrowing("execution(* com.test.aop.IAop.testAop(..))")
    public void aopAfterthrowing(){
        System.out.println("invoke AopTest aopAfterthrowing medthod");
    }

关闭异常后执行结果

在这里插入图片描述

打开异常后执行结果

在这里插入图片描述

环绕通知:Around

可以在目标方法执行前后自定义行为

环绕通知可以携带参数ProceedingJoinPoint

其proceed()方法用于调用目标方法
当不调用时可以控制对目标的访问

也可以多次调用来实现重试逻辑

继续在切面中添加返回通知

//@Around为环绕通知
@Around("execution(* com.test.aop.IAop.testAop(..))")
    public void aopAround(ProceedingJoinPoint pj) throws Throwable {
        System.out.println("invoke AopTest aopAround1 medthod");
        //用于调用目标方法
        pj.proceed();
        System.out.println("invoke AopTest aopAround2 medthod");
    }

当不调用时:关闭pj.proceed();调用

在这里插入图片描述

当的多次调用后

在这里插入图片描述

打开异常后执行结果

在这里插入图片描述

关闭异常后执行结果

在这里插入图片描述

注意

在测试中的异常情况反应出:返回通知环绕通知会因异常的出现进而中断

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值