spring aop框架对BeforeAdvice、AfterAdvice、ThrowsAdvice三种通知类型的支持实际上是借助适配器模式来实现的,这样的好处是使得框架允许用户向框架中加入自己想要支持的任何一种通知类型,上述三种通知类型是spring aop框架定义的,它们是aop联盟定义的Advice的子类型。
位于org.springframework.aop.framework.adapter包中的AdvisorAdapter是一个适配器接口,它定义了自己支持的Advice类型,并且能把一个Advisor适配成MethodInterceptor(这也是AOP联盟定义的借口),以下是它的定义
public interface AdvisorAdapter {
// 将一个Advisor适配成MethodInterceptor
MethodInterceptor getInterceptor(Advisor advisor);
// 判断此适配器是否支持特定的Advice
boolean supportsAdvice(Advice advice);
}
这个接口允许扩展spring aop框架,以便处理新的Advice或Advisor类型,其实现对象可以把某些特定的Advice类型适配成AOP联盟定义的MethodInterceptor,并在spring aop框架中启用这些通知类型。通常spring用户不需要实现这个接口,除非想把更多的Advice和Advisor引入到spring中时。
spring aop框架本身为这个接口提供了很好的实现,例如为了支持MethodBeforeAdivce、AfterReturningAdvice、以及ThrowsAdvice这三种通知类型,spring在org.springframework.aop.framework.adapter包中分别为它们定义了相应的适配器,在此仅以AfterReturningAdviceAdapter为例
class AfterReturningAdviceAdapter implements AdvisorAdaptor, Serializable {
// 此适配器仅支持AfterReturningAdivce类型
public boolean supportsAdvice(Advice advice) {
return advice instanceof AfterReturningAdivce;
}
// 把特定的Advisor适配成MethodInterceptor
public MethodInterceptor getInterceptor(Advisor advisor) {
AfterReturningAdivce advice = (AfterReturningAdivce) advisor.getAdvice();
return new AfterReturningAdviceInterceptor(advice);
}
}
其中,AfterReturningAdviceInterceptor也是org.springframework.aop.framework.adapter包中定义的
public class AfterReturningAdviceInterceptor implements MethodInterceptor,
AfterAdvice, Serializable {
private final AfterReturningAdvice advice;
public AfterReturningAdviceInterceptor(AfterReturningAdvice advice) {
this.advice = advice;
}
// 实现MethodInterceptor中定义的invoke方法
public Object invoke(MethodInvocation mi) throws Throwable {
Object ret = mi.proceed();
this.advice.afterReturning(ret, mi.getMethod(), mi.getArguments(), mi.getThis());
return ret;
}
}
那么,这些适配器在spring aop框架中是如何发挥作用的呢,位于org.springframework.aop.framework.adapter包中的AdvisorAdapterRegistry接口定义了管理AdvisorAdapter的语义
public interface AdvisorAdaptorRegistry {
// 为某一Advisor返回所有适合它的方法拦截器
MethodInterceptor[] getInterceptors(Advisor advisor);
// 注册AdvisorAdapter
void registerAdvisorAdapter(AdvisorAdapter adapter);
// 将一个Advice包装成一个Advisor
Advisor wrap(Object advice);
}
它的默认实现是DefaultAdvisorAdapterRegistry,它也同样位于org.springframework.aop.framework.adapter包中,我们在如下的定义中可以看到,MethodBeforeAdivceAdapter、AfterReturningAdviceAdapter以及ThrowsAdviceAdapter已经被事先注册到了DefaultAdvisorAdapterRegistry中
public class DefaultAdvisorAdapterRegistry implements AdvisorAdapterRegistry,
Serializable {
private final List adapters = new ArrayList(3);
public DefaultAdvisorAdapterRegistry() {
registerAdvisorAdapter(new MethodBeforeAdviceAdapter());
registerAdvisorAdapter(new AfterReturningAdviceAdapter());
registerAdvisorAdapter(new ThrowsAdviceAdapter());
}
// .......
}
这个包中的GlobalAdvisorAdapterRegistry只不过为DefaultAdvisorAdapterRegistry提供了单例模式的实现,典型的获得DefaultAdvisorAdapterRegistry实例的代码是AdvisorAdapterRegistry registry=GlobalAdvisorAdapterRegistry.getInstance();如果我们想把自己定义的AdvisorAdapter注册到spring aop框架中也是可以的,除了把我们自定义的AdvisorAdapter当作一个最普通的bean注册到spring的IOC容器之外还需要注册spring中定义的一个bean,那就是AdvisorAdapterRegistrationManager,它也位于org.springframework.aop.framework.adapter包中,有兴趣的朋友可以看看它的源码,再简单不过了,它只不过是实现了BeanPostProcessor接口,并在postProcessAfterInitialization方法中检测bean是否实现了AdvisorAdapter,如果实现了就把它注册到全局的AdvisorAdapter管理器中。