学习笔记:5_Spring_AOP之通知类型

1、  前置通知和后置通知(即使异常也会执行)

a)        接口

package com.spring.aop2;

public interface IDivision {
public int division(int a,int b);
}

 

b)        接口实现类

package com.spring.aop2;
import org.springframework.stereotype.Component;
@Component
public class Division implements IDivision {
public int division(int a,int b){
int c=a/b;
return c;
}
}

 

c)        切面类com.spring.aop2.DivisionAspect的前置通知和后置通知

//前置通知
@Before("execution(public int com.spring.aop2.Division.*(..))")
public void beforeAop(JoinPoint jp){
String methodName=jp.getSignature().getName();//获得被调用的方法名
Object[] args=jp.getArgs();//获得被调用方法的参数
System.out.println("@Before执行:"+methodName+"方法,参数为:"+Arrays.asList(args));
}

//后置通知
@After("execution(public int com.spring.aop2.Division.*(..))")
public void afterAop(JoinPoint jp){
String methodName=jp.getSignature().getName();//获得被调用的方法名
Object[] args=jp.getArgs();//获得被调用方法的参数
System.out.println("@After执行:"+methodName+"方法,参数为:"+Arrays.asList(args));
}

d)        配置文件(注意定义aop和context)

 

e)        main方法

 

f)         执行结果

 

 

 

2、  返回通知

//返回通知
//@AfterReturning注解中添加表达式returning属性用来传入返回值
@AfterReturning(pointcut="execution(public int com.spring.aop2.Division.*(..))",returning="result")
//第二个参数Object的参数名必须和表达式returning属性名一致
public void afterReturningAop(JoinPoint jp,Object result){
String methodName=jp.getSignature().getName();//获得被调用的方法名
Object[] args=jp.getArgs();//获得被调用方法的参数
System.out.println("@AfterReturning执行:"+methodName+"方法,参数为:"+Arrays.asList(args)+",返回结果为:"+result);
}

3、  异常通知

//异常通知
//@AfterThrowing注解中添加表达式throwing属性用来传入异常信息
@AfterThrowing(pointcut="execution(public int com.spring.aop2.Division.*(..))",throwing="ex")
//第二个参数异常类(也可以根据需要指定异常类)的参数名必须和表达式throwing属性名一致
public void afterThrowingAop(JoinPoint jp,Exception ex){
String methodName=jp.getSignature().getName();//获得被调用的方法名
Object[] args=jp.getArgs();//获得被调用方法的参数
System.out.println("@AfterReturning执行:"+methodName+"方法,参数为:"+Arrays.asList(args)+",异常信息为:"+ex);
}

4、  环绕通知(不常用)环绕通知包括了前置通知、后置通知、返回通知、异常通知

//环绕通知(此例子不完美有异常)
@Around("execution(public int com.spring.aop2.Division.*(..))")
public void aroundAop(ProceedingJoinPoint pjp){
String methodName=pjp.getSignature().getName();//获得被调用的方法名
Object[] args=pjp.getArgs();//获得被调用方法的参数
try {
System.out.println("@Around执行前置通知:"+methodName+"方法,参数为:"+Arrays.asList(args));
Object result=pjp.proceed();//执行方法被调用并得到返回值
System.out.println("@Around执行返回通知,返回值为:"+result);
} catch (Throwable ex) {
ex.printStackTrace();
System.out.println("@Around执行异常通知,异常信息为:"+ex);
}
System.out.println("@Around执行后置通知");
}

 


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值