springaop五⼤通知类型
1、定义
1、before(前置通知):在连接点⽅法之前执⾏,不能控制连接点⽅法是否执⾏。
2、after(后置通知):⼜名最终通知,连接点⽅法只要执⾏,不管会不会出现错误,它最后都会被执⾏。
3、after-return(返回通知):连接点正常执⾏,并且不会报错才会执⾏。
4、throwing(异常通知):连接点⽅法抛出异常时才会执⾏,这个通知不能处理异常,只能得到异常信息,异常通知如果想要把⽬标⽅法抛出的异常传递给通知⽅法,只要在异常通知的throwing属性设置等于通知⽅法的参数名即可。如果没有设置异常类型,⽬标⽅法抛出任何异常,此通知不执⾏,后⾯的通知都会执⾏。有设置异常类型做参数,⽬标⽅法抛出的异常是通知⽅法参数的指定类型异常或⼦类型时,此通知⽅法才会得到执⾏。
5、around(环绕通知):结合了上⾯四种通知,加强版的通知,可以实现上⾯四种通知的功能。
2、before(前置通知)
after和after-return和前置通知差不多,就不做解释了。
普通前置通知
<aop:before method="BeforeInsert" pointcut-ref="studentPointcut"/>
//通知⽅法
public void BeforeInsert(JoinPoint joinPoint){
System.out.println(joinPoint);
System.out.println("BeforeInsert as LogImpl");
}
通知⽅法可以选择是否带参数,可带JoinPoint参数,这个参数包含了连接点的⼀些信息。
我们也可以在这⾥获取连接点⽅法的参数值。
连接点
public int add(int num1,int num2){
return num1+num2;
}
通知
public void beforeInsert(JoinPoint joinPoint,int n,int m){
System.out.println(n);
System.out.println(m);
System.out.println(joinPoint);
System.out.println("BeforeInsert as LogImpl");
}
xml
<aop:config>
<!--切点表达式中添加and 设置别名,可以设置和通知⽅法的参数名⼀样的-->
<aop:pointcut id="studentPointcut" expression="execution(* com.target.StudentDaoImpl.*(..)) and args(n,m)"/>
<aop:aspect id="logAspect" ref="log">spring aop应用场景
<!--arg-names对应切点表达式的别名-->
<aop:before method="beforeInsert" pointcut-ref="studentPointcut" arg-names="n,m"/>
</aop:aspect>
</aop:config>
切点表达式设置了args(n,m),那么其它通知也需要添加对应的⽅法参数和设置arg-names
3、throwing(异常通知)
<aop:after-throwing method="throwInsert" pointcut-ref="studentPointcut" throwing="ey"/>
throwing指定异常类型参数
public void throwInsert(RuntimeException ey) {
System.out.println("throwException");
}
如果异常通知⽅法没有设置异常参数,throwing不⽤设置参数,⽬标⽅法产⽣的所有异常都会使⽤此通知⽅法
异常通知⽅法设置了异常参数,throwing需要设置跟异常参数,⽬标⽅法产⽣的异常是此通知异常类型或⼦类型时,该通知⽅法才会被使⽤。
4、around(环绕通知)
<aop:around method="aroundInsert" pointcut-ref="studentPointcut"/>
通知⽅法:
public Object aroundInsert(ProceedingJoinPoint joinPoint){
//相当于before
System.out.println("");
//定义result保存调⽤⽅法结果
Object result = null;
try {
//调⽤⽅法
result = joinPoint.proceed();
//相当于after-return
System.out.println("");
} catch (Throwable throwable) {
throwable.printStackTrace();
/
/相当于throwing
System.out.println("");
}
//相当于after
System.out.println("");
//返回结果
return result;
}
around⼀般使⽤⽐较多,因为它包含了上⾯四种的功能。
ProceedingJoinPoint ⼀般作为环绕通知⽅法的参数,它实现了JoinPoint接⼝,增强版。可以控制⽬标⽅法的执⾏以及查看⽬标⽅法的参数等等。
JoinPoint作为上⾯四种通知的参数。它包含了⼀系列的⽬标⽅法的信息。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。