使用 AspectJ 方式实现
1. 新建类,不用实现
类中方法名任意
public class MyAdvice {
public void mybefore(String name1,int age1){
System.out.println("前置"+name1 );
}
public void mybefore1(String name1){
System.out.println("前置:"+name1);
}
public void myaftering(){
System.out.println("后置 2");
}
public void myafter(){
System.out.println("后置 1");
}
public void mythrow(){
System.out.println("异常");
}
public Object myarround(ProceedingJoinPoint p) throws Throwable{
System.out.println("执行环绕");
System.out.println("环绕-前置");
Object result = p.proceed();
System.out.println("环绕后置");
return result;
}
}
2.配置 spring 配置文件
- aop:after/ 标签—— 后置通知,是否出现异常都执行
- aop:after-returing/ 标签——后置通知,只有当切点正确执行时
执行 - aop:after/ 和 aop:after-returing/ 和aop:after-throwing/ 标签——执行顺序和配置顺序有关
- execution() 括号不能扩上 args
- 中间使用 and 不能使用&& 由 spring 把 and 解析成&&
- args(名称) 名称自定义的.顺序和 demo1(参数,参数)对应
- aop:before/ 标签 arg-names=” 名 称 ” 名 称 来 源 于expression=”” 中 args(),名称必须一样
①args() 有几个参数,arg-names 里面必须有几个参数
②arg-names=”” 里面名称必须和通知方法参数名对应
<aop:config>
<aop:aspect ref="myadvice">
<aop:pointcut expression="execution(* com.youdian.test.Demo.demo1(String,int)) and args(name1,age1)" id="mypoint"/>
<aop:pointcut expression="execution(*com.youdian.test.Demo.demo1(String)) and args(name1)" id="mypoint1"/>
<aop:before method="mybefore" pointcut-ref="mypoint" arg-names="name1,age1"/>
<aop:before method="mybefore1" pointcut-ref="mypoint1" arg-names="name1"/>
<!-- <aop:after method="myafter" pointcut-ref="mypoint"/>
<aop:after-returning method="myaftering" pointcut-ref="mypoint"/>
<aop:after-throwing method="mythrow" pointcut-ref="mypoint"/>
<aop:around method="myarround" pointcut-ref="mypoint"/>-->
</aop:aspect>
</aop:config>