## MethodInterceptor - [MethodInterceptor](#methodinterceptor) - [一、基本信息](#一基本信息) - [二、基本描述](#二基本描述) - [三、主要功能](#三主要功能) - [四、接口源码](#四接口源码) - [五、主要实现](#五主要实现) - [六、类关系图](#六类关系图) - [七、最佳实践](#七最佳实践) ### 一、基本信息 ✒️ **作者** - Lex 📝 **博客** - [掘金](https://juejin.cn/user/4251135018533068/posts) 📚 **源码地址** - [github](https://github.com/xuchengsheng/spring-reading) ### 二、基本描述 `MethodInterceptor`接口是Spring框架中的一个核心接口,用于实现面向切面编程(AOP)。通过实现该接口,可以在目标方法执行前后、异常抛出时等关键点对方法进行拦截和增强,从而实现横切关注点的集中管理,提高代码的可维护性和灵活性。 ### 三、主要功能 1. **方法拦截和增强** + 可以在目标方法执行前后、异常抛出时等关键点对方法进行拦截和增强,从而实现横切关注点的代码集中管理。 ### 四、接口源码 `MethodInterceptor`接口是用于拦截接口方法调用并在目标方法之前和之后执行额外处理的核心接口。我们需要实现其中的`invoke`方法来定义拦截器的具体行为,例如,可以实现一个跟踪拦截器来追踪被拦截方法的调用情况。在`invoke`方法中,通常会调用`proceed()`方法来继续执行目标方法,并在必要时对返回值或异常进行处理。 ```java /** * 拦截器,用于拦截接口方法调用并在目标方法之前和之后执行额外处理。 * 这些拦截器被嵌套在目标方法之上。 * *
用户应该实现 {@link #invoke(MethodInvocation)} 方法来修改原始行为。例如,以下类实现了一个跟踪拦截器(跟踪所有被拦截方法的调用):
*
* @author Rod Johnson
*/
@FunctionalInterface
public interface MethodInterceptor extends Interceptor {
/**
* 实现此方法以在调用之前和之后执行额外处理。礼貌的实现应该肯定地调用 {@link Joinpoint#proceed()}。
* @param invocation 方法调用连接点
* @return 调用 {@link Joinpoint#proceed()} 的结果;可能会被拦截器拦截
* @throws Throwable 如果拦截器或目标对象抛出异常
*/
@Nullable
Object invoke(@Nonnull MethodInvocation invocation) throws Throwable;
}
```
### 五、主要实现
1. **MethodBeforeAdviceInterceptor**
+ 实现了前置通知的拦截器。前置通知在目标方法执行之前执行,允许我们在方法执行前插入额外的逻辑。通常用于日志记录、参数验证等场景。
2. **AfterReturningAdviceInterceptor**
+ 实现了返回后通知的拦截器。返回后通知在目标方法成功执行并返回结果后执行,允许我们在方法返回后插入额外的逻辑。通常用于日志记录、结果处理等场景。
3. **ThrowsAdviceInterceptor**
+ 实现了异常抛出后通知的拦截器。异常抛出后通知在目标方法抛出异常后执行,允许我们在方法抛出异常后插入额外的逻辑。通常用于异常处理、日志记录等场景。
### 六、类关系图
~~~mermaid
classDiagram
direction BT
class AfterReturningAdviceInterceptor
class Interceptor {
<