当前位置: 代码网 > it编程>编程语言>Asp.net > MethodInterceptor的使用与AOP的关系解读

MethodInterceptor的使用与AOP的关系解读

2026年03月03日 Asp.net 我要评论
前言项目中可以使用aop切面来进行增强处理,也可以自行实现一个methodinterceptor对代码进行增强处理,相比与使用aop可以更加轻便的形成连接器链;使用引入pom <d

前言

项目中可以使用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或移除图标标记

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com