AfterReturningAdviceInterceptor
显然它是对AfterReturningAdvice的一个包装
public class AfterReturningAdviceInterceptor implements MethodInterceptor, AfterAdvice, Serializable { private final AfterReturningAdvice advice; public AfterReturningAdviceInterceptor(AfterReturningAdvice advice) { Assert.notNull(advice, "Advice must not be null"); this.advice = advice; } @Override public Object invoke(MethodInvocation mi) throws Throwable { Object retVal = mi.proceed(); // 嗲用afterReturning,它是能够享受到返回值的 this.advice.afterReturning(retVal, mi.getMethod(), mi.getArguments(), mi.getThis()); return retVal; } }
ThrowsAdviceInterceptor
包装的ThrowsAdvice,实际处理起来稍微复杂点~~~
public class ThrowsAdviceInterceptor implements MethodInterceptor, AfterAdvice { ... }
上面三个拦截器,可议参考适配器:
public class DefaultAdvisorAdapterRegistry implements AdvisorAdapterRegistry, Serializable { ... public DefaultAdvisorAdapterRegistry() { registerAdvisorAdapter(new MethodBeforeAdviceAdapter()); registerAdvisorAdapter(new AfterReturningAdviceAdapter()); registerAdvisorAdapter(new ThrowsAdviceAdapter()); } ... }
CacheInterceptor / AsyncExecutionInterceptor
这两个分别涉及到Spring的cache部分以及Async异步部分,这在讲述这块的时候会具体的进行分析。
总结
aopalliance属于AOP联盟,定义了一些标准。一共只几个接口,总结如下:
org.aopalliance.aop包
- Advice:通知的标记接口。实现可以是任意类型,比如下面的Interceptor
- AspectException:所有的AOP框架产生异常的父类。它是个RuntimeException
org.aopalliance.intercept包
- Interceptor:它继承自Advice,它通过拦截器得方式实现通知的效果(也属于标记接口)
- MethodInterceptor:具体的接口。拦截方法 (Spring提供了非常多的具体实现类)
- ConstructorInterceptor:具体接口。拦截构造器 (Spring并没有提供实现类)
- Joinpoint:AOP运行时的连接点(顶层接口)
- Invocation:继承自Joinpoint。 表示执行,提供了Object[] getArguments()来获取执行所需的参数
- MethodInvocation:(和MethodInterceptor对应,它的invoke方法入参就是它)表示一个和方法有关的执行器。提供方法Method getMethod() (Spring提供了唯一(唯二)实现类:ProxyMethodInvocation)
- ConstructorInvocation:和构造器有关。Constructor<?> getConstructor(); (Spring没有提供任何实现类)
这就是AOP联盟为我们提供的所有的类,它里面全部是接口(那个异常类除外),相当于它定义了一套AOP的标准类。Spring对核心的Method相关的拦截、执行器做了对应的实现。
注意,Spring的AOP实现并不依赖于AspectJ任何类,它自己实现了一套AOP的。比如它Spring自己提供的BeforeAdvice和AfterAdvice都是对AOP联盟规范的标准实现。以及Spring自己抽象出来的对Advice的包装:org.springframework.aop.Advisor贯穿Spring AOP的始终
但是在当前注解驱动的流行下,基于POJO(xml方式)以及编程的方式去书写AOP代理,显得非常的繁琐。因此Spring提供了另外一种实现:基于AspectJ,到这才使用到了AspectJ的相关注解、以及类。
但是还需要说明一点:哪怕使用到了AspectJ的相关注解和类,但核心的AOP织入的逻辑,还都是Spring自己用动态代理去实现的,没用AspectJ它那种特殊的语法和特有的编译器
最后说一句,若在Spring AOP中想使用AspectJ的方式去实现(也是当下最流行的方式),必须导入Jar包:aspectjweaver-1.9.2.jar,而Spring的这个包org.springframework.aop.aspectj下面的所有类,都是专门为了使用@Aspect的方式去服务的,毕竟AOP功能是Spring自己实现的,而不是依赖于AspectJ这个组件的