spring aop 五大通知类型
1、定义
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"); }
我们也可以在这里获取连接点方法的参数值。
连接点
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"> <!--arg-names对应切点表达式的别名--> <aop:before method="beforeInsert" pointcut-ref="studentPointcut" arg-names="n,m"/> </aop:aspect> </aop:config>
切点表达式设置了args(n,m),那么其它通知也需要添加对应的方法参数和设置arg-names
<aop:after-throwing method="throwInsert" pointcut-ref="studentPointcut" throwing="ey"/>
throwing指定异常类型参数
public void throwInsert(RuntimeException ey) { System.out.println("throwException"); }
异常通知方法设置了异常参数,throwing需要设置跟异常参数,目标方法产生的异常是此通知异常类型或子类型时,该通知方法才会被使用。
<aop:around method="aroundInsert" pointcut-ref="studentPointcut"/>
通知方法:
public Object aroundInsert(ProceedingJoinPoint joinPoint){ //相当于before System.out.println("Before...."); //定义result保存调用方法结果 Object result = null; try { //调用方法 result = joinPoint.proceed(); //相当于after-return System.out.println("after-return...."); } catch (Throwable throwable) { throwable.printStackTrace(); //相当于throwing System.out.println("throwing...."); } //相当于after System.out.println("after...."); //返回结果 return result; }
around一般使用比较多,因为它包含了上面四种的功能。
ProceedingJoinPoint 一般作为环绕通知方法的参数,它实现了JoinPoint接口,增强版。可以控制目标方法的执行
以及查看目标方法的参数等等。
JoinPoint作为上面四种通知的参数。它包含了一系列的目标方法的信息。