笑看尘世|Spring4基础二二-AOP篇-通知(2)-通知详解

上一章节《Spring4基础二一-AOP篇-通知(1)-入门讲解》
如果文中有纰漏,请多多指正!!!
一.通知详解

  • 1.jar包引入
除了要引入核心jar及日志jar外 , 还需要引入依赖包com.springsource.org.aopalliance-1.0.0.jar这个包是AOP联盟的API包 , 里面包含了针对面向切面的接口 。 通常Spring等其它具备动态织入功能的框架依赖此包 。 否则会报如下错误【The hierarchy of the type MyMethodBeforeAdvice is inconsistent】
笑看尘世|Spring4基础二二-AOP篇-通知(2)-通知详解
  • 2.前置通知定义:MethodBeforeAdvice
前置通知在目标方法执行之前执行 , 不改变目标方法的执行流程 , 必须实现MethodBeforeAdvice接口 。
//自定义前置通知public class MyMethodBeforeAdvice implements MethodBeforeAdvice{/*** @param method 目标对象要执行的方法* @param args 方法的参数* @param target 目标对象* @throws Throwable 如果这个对象想要终止调用 , 那么抛出异常 , 异常会返回给方法调用者 , 否则异常会被包装为运行时异常*/@Overridepublic void before(Method method, Object[] args, Object target) throws Throwable {System.out.println("前置的通知:[MyMethodBeforeAdvice]");}}
  • 3.后置通知:AfterReturningAdvice
后置通知,在目标方法执行之后执行 , 不改变目标方法的执行流程 , 可以获取到目标方法的返回结果 , 但无法改变目标方法的结果 。
定义后置通知需要实现接口AfterReturningAdvice 。 该接口中有一个方法afterReturning() , 会在目标方法执行之后执行 。
//自定义后置通知public class MyAfterReturningAdvice implements AfterReturningAdvice{/*** 当方法成功返回之后运行* @param returnValue 如果方法有返回值 , 那么returnValue就是返回值* @param method 目标对象执行的方法* @param args 方法的参数* @param target 目标对象* @throws Throwable 同上*/@Overridepublic void afterReturning(Object returnValue, Method method,Object[] args, Object target) throws Throwable {System.out.println("后置通知:MyAfterReturningAdvice");}}
  • 4.环绕通知:MethodInterceptor
环绕通知也叫做方法拦截器 , 可以在目标方法调用之前及之后做处理 , 可以改变目标方法的返回值 , 也可以改变程序执行流程 , 需要实现MethodInterceptor接口 。
//自定义环绕通知public class MyMethodInterceptor implements MethodInterceptor{/*** @param invocation 封装了目标对象和参数数组*调用它的invocation.proceed()方法即执行目标对象的方法 。* @return 返回增强处理后的方法执行的结果*/@Overridepublic Object invoke(MethodInvocation invocation) throws Throwable {System.out.println("环绕通知:目标方法执行之前");// 执行目标方法Object result = invocation.proceed();System.out.println("环绕通知:目标方法执行之后");if(result != null) {//可以改变目标方法的返回值result = ((String)result).toUpperCase();}return result;}}
  • 5.异常通知:ThrowsAdvice
异常通知需要实现ThrowsAdvice接口(标识接口) 。 当切点方法抛出异常时 , 异常抛出增强才会被执行 。 该接口没有指定必须要实现的方法 。 但接口源码注释定义指定了四种实现方法 , 可根据需要选择实现 。
public void afterThrowing(Exception ex)public void afterThrowing(RemoteException)