MethodInterceptor的使用与AOP的关系解读

 更新时间:2026年03月03日 08:35:35   作者:一恍过去  
本文比较了AOP切面和MethodInterceptor对代码增强处理的不同方式,指出MethodInterceptor更加轻便且可以自定义排序,通过实际代码验证了AOP和Interceptor的结合使用情况,并分析了两者在实现方式、定位、抽象层级、性能开销等方面的差异

前言

项目中可以使用AOP切面来进行增强处理,也可以自行实现一个MethodInterceptor对代码进行增强处理,相比与使用AOP可以更加轻便的形成连接器链;

使用

引入POM

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>

配置Interceptor

import jakarta.annotation.Resource;
import org.springframework.aop.aspectj.AspectJExpressionPointcut;
import org.springframework.aop.support.DefaultPointcutAdvisor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class ServiceInterceptorConfig {

    private static final String EXECUTION = "execution(* com.lhz.demo.service.UserService.*(..))";

    @Resource
    private ServiceInterceptor serviceInterceptor;

    @Bean
    public DefaultPointcutAdvisor defaultPointcutAdvisor() {
        DefaultPointcutAdvisor advisor = new DefaultPointcutAdvisor();

        AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut();
        pointcut.setExpression(EXECUTION);

        advisor.setPointcut(pointcut);
        advisor.setAdvice(serviceInterceptor);
        advisor.setOrder(-1);
        return advisor;
    }
}

自定义Interceptor

@Component
@Slf4j
public class ServiceInterceptor implements MethodInterceptor {
    @Override
    public Object invoke(MethodInvocation methodInvocation) throws Throwable {
        log.info("进入ServiceInterceptor...");
        Object[] arguments = methodInvocation.getArguments();
        return methodInvocation.proceed();
    }
}

排序

单个Interceptor、多个Interceptor、AOP使用的相同的pointcut时,请求都会进入,只是进入的先后顺序不同,AOP中可以直接通过@Order注解控制,Interceptor通过advisor.setOrder()方法进行设置;

验证

同时存在AOP和Interceptor的情况,并且AOP的order=-2,Interceptor的order=-1

AOP代码如下:

@Aspect
@Component
@Slf4j
@Order(-2)
public class ServiceAop {

    @Pointcut("execution(* com.lhz.demo.service.UserService.*(..))")
    public void point() {
    }

    @Before("point()")
    public void doBeforeAdvice(JoinPoint point) {
        log.info("进入前置通知...");
    }

    @Around("point()")

    public void doAroundAdvice(ProceedingJoinPoint point) throws Throwable {

        log.info("进入环绕通知...");

        point.proceed();

    }

}

结果:

对比

对比维度MethodInterceptorAOP (广义)
定位AOP 的具体实现组件编程范式/思想
抽象层级具体的技术实现高层次的设计理念
标准化AOP Alliance 标准接口无统一标准,各框架实现不同

核心差异

特性MethodInterceptor声明式AOP差异分析
实现方式实现MethodInterceptor接口使用@Aspect注解前者需手动编码,后者通过元数据配置
拦截粒度方法调用级别控制切入点表达式匹配MethodInterceptor可获取MethodInvocation完整上下文
执行控制显式调用invocation.proceed()隐式调用joinPoint.proceed()前者对执行流程控制更直观
性能开销△ 较低(直接方法调用)○ 略高(需解析注解)差异在微秒级,高并发场景需考虑
适用阶段动态代理支持LTW/CTWAspectJ的编译时织入能力更强
依赖关系仅依赖AOP Alliance API依赖具体框架(如Spring AOP)前者更易移植
调试复杂度需跟踪代理链切面集中管理声明式AOP的堆栈信息更友好
动态能力★★★★ 可运行时修改拦截逻辑★★ 配置后固定MethodInterceptor适合需要热更新的场景
代码侵入性目标类无需修改但需引入AOP依赖两者都符合AOP的非侵入理念
典型应用场景安全校验/参数过滤/熔断机制日志/事务/缓存等常规切面根据业务复杂度选择

注:实际使用时建议将图标替换为对应的emoji或移除图标标记

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java打包工具jar包详解

    Java打包工具jar包详解

    这篇文章主要介绍了Java打包工具jar包详解,在本例中我们引入一个叫jaxen.jar的库,并将所有以”org.jaxen”开头的类重命名以”org.example.jaxen”开头,具体实例代码跟随小编一起看看吧
    2021-10-10
  • Spring init-method与destroy-method属性的用法解析

    Spring init-method与destroy-method属性的用法解析

    这篇文章主要介绍了Spring init-method与destroy-method属性的用法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • SSH框架网上商城项目第20战之在线支付平台

    SSH框架网上商城项目第20战之在线支付平台

    这篇文章主要为大家详细介绍了SSH框架网上商城项目第20战之在线支付平台,关于第三方支付的内容从本文开始,感兴趣的小伙伴们可以参考一下
    2016-06-06
  • 详解Nacos配置中心的实现

    详解Nacos配置中心的实现

    Spring Cloud Alibaba 是阿里巴巴提供的一站式微服务开发解决方案。而 Nacos 作为 Spring Cloud Alibaba 的核心组件之一,提供了两个非常重要的功能:注册中心和配置中心,我们今天来了解和实现一下二者
    2022-08-08
  • Java冒泡排序(Bubble Sort)实例讲解

    Java冒泡排序(Bubble Sort)实例讲解

    冒泡排序的原理:假设要求的数组是正序,两两进行比较,如果前一个书比后一个数小,位置不变。如果前一个数比后一个数大,位置互换,再跟后一个数进行比较,直到最后。就是逐步把大数送到最后,下面来个实例给大家看看
    2013-11-11
  • 解析Java异步之call future

    解析Java异步之call future

    当调用一个函数的时候,如果这个函数的执行过程是很耗时的,就必须要等待,但是有时候并不急着要这个函数返回的结果。因此,可以让被调者立即返回,让他在后台慢慢处理这个请求。对于调用者来说,可以先处理一些其他事情,在真正需要数据的时候再去尝试获得需要的数据
    2021-06-06
  • Java中的异步与线程池解读

    Java中的异步与线程池解读

    这篇文章主要介绍了Java中的异步与线程池,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • IDEA 中创建并部署 JavaWeb 程序的方法步骤(图文)

    IDEA 中创建并部署 JavaWeb 程序的方法步骤(图文)

    本文主要介绍了IDEA 中创建并部署 JavaWeb 程序的方法步骤,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • SpringBoot + MapStruct 属性映射工具的使用详解

    SpringBoot + MapStruct 属性映射工具的使用详解

    MapStruct 是一个代码生成器,简化了不同的 Java Bean 之间映射的处理,所谓的映射指的就是从一个实体变化成一个实体。接下来通过本文给大家介绍SpringBoot + MapStruct 属性映射工具的使用,需要的朋友可以参考下
    2021-09-09
  • Java将Object转换为数组的代码

    Java将Object转换为数组的代码

    这篇文章主要介绍了Java将Object转换为数组的情况,今天在使用一个别人写的工具类,这个工具类,主要是判空操作,包括集合、数组、Map等对象是否为空的操作,需要的朋友可以参考下
    2022-09-09

最新评论