在spring中与通知相关的类有:spring
以Advice结尾的通知接口ide
MethodBeforeAdvice AfterReturningAdvice ThrowsAdvicethis
以Interceptor结尾的拦截器spa
MethodBeforeAdviceInterceptor AfterReturningAdviceInterceptor ThrowsAdviceInterceptorcode
以Adapter结尾的适配器blog
MethodBeforeAdviceAdapter AfterReturningAdviceAdapter ThrowsAdviceAdapter接口
先了解一下Adapter模式get
而这三者间的关系以MethodBefore为例:源码
下面以MethodBefore为例,看一下源码。io
先看一下AdvisorAdapter接口
public interface AdvisorAdapter { boolean supportsAdvice(Advice advice); MethodInterceptor getInterceptor(Advisor advisor); }
MethodBeforeAdviceAdapter类
class MethodBeforeAdviceAdapter implements AdvisorAdapter, Serializable { @Override public boolean supportsAdvice(Advice advice) { return (advice instanceof MethodBeforeAdvice); } @Override public MethodInterceptor getInterceptor(Advisor advisor) { MethodBeforeAdvice advice = (MethodBeforeAdvice) advisor.getAdvice(); return new MethodBeforeAdviceInterceptor(advice); } }
而MethodBeforeAdviceInterceptor是具体的实现。
例外在看一下MethodBeforeAdviceInterceptor类
public class MethodBeforeAdviceInterceptor implements MethodInterceptor, Serializable { private MethodBeforeAdvice advice; /** * Create a new MethodBeforeAdviceInterceptor for the given advice. * @param advice the MethodBeforeAdvice to wrap */ public MethodBeforeAdviceInterceptor(MethodBeforeAdvice advice) { Assert.notNull(advice, "Advice must not be null"); this.advice = advice; } @Override public Object invoke(MethodInvocation mi) throws Throwable { this.advice.before(mi.getMethod(), mi.getArguments(), mi.getThis() ); return mi.proceed(); } }
实现了MethodIntercepter接口,在调用invoke进行拦截的时候,是先调用before方法里面,而后在调用具体的方法实现。