使用AspectJ方式实现通知类
一、异常通知
1、新建类,在类写任意名称的方法
public class MyThrowAdvice{
public void myexception(Exception e){
System.out.println("执行异常通知"+e1.getMessage());
}
}
2、在 spring 配置文件中配置
<aop:aspect>的 ref 属性表示:方法在哪个类中.
<aop: xxxx/> 表示什么通知
method: 当触发这个通知时,调用哪个方法
throwing: 异常对象名,必须和通知中方法参数名相同(可以不在通知中声明异常对象)
<bean id="demo" class="com.wzg.test.Demo">
<bean id="mythrow" class="com.wzg.advice.MyThrowAdvice"></bean>
<aop:config>
<aop:aspect ref="mythrow">
<aop:pointcut expression="execution(* com.wzg.test.Demo.demo1())" id="mypoint"/>
<aop:after-throwing method="myexception" pointcut-ref="mypoint" throwing="e"/>
</aop:aspect>
</aop:config>
</bean>
二、实现前后置通知以及环绕通知
package com.wzg.advice;
import org.aspectj.lang.ProceedingJoinPoint;
public class MyAdvice {
public void mybefore() {
System.out.println("前置 ");
}
public void myafter() {
System.out.println("后置1");
}
public void myafter2() {
System.out.println("后置2");
}
public Object myarround(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("执行环绕");
System.out.println("前置环绕");
Object object = joinPoint.proceed();
System.out.println("后置环绕");
return object;
}
}
spring配置文件
<aop:after/> 后置通知,是否出现异常都执行
<aop:after-returing/> 后置通知,只有当切点正确执行时执行
<aop:after/> 和 <aop:after-returing/> 和<aop:after-throwing/>执行顺序和配置顺序有关
<aop:config>
<aop:aspect ref="myadvice">
<aop:pointcut expression="execution(* com.wzg.test.Demo.demo1())"id="mypoint"/>
<aop:before method="mybefore" pointcut-ref="mypoint"/>
<aop:after method="myafter" pointcut-ref="mypoint"/>
<aop:after-returning method="myafter2" pointcut-ref="mypoint"/>
<aop:after-throwing method="mythrow" pointcut-ref="mypoint"/>
<aop:around method="myarround" pointcut-ref="mypoint"/>
</aop:aspect>
</aop:config>