最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MethodInterceptor的使用與AOP的關(guān)系解讀

 更新時間:2026年03月03日 08:35:35   作者:一恍過去  
本文比較了AOP切面和MethodInterceptor對代碼增強處理的不同方式,指出MethodInterceptor更加輕便且可以自定義排序,通過實際代碼驗證了AOP和Interceptor的結(jié)合使用情況,并分析了兩者在實現(xiàn)方式、定位、抽象層級、性能開銷等方面的差異

前言

項目中可以使用AOP切面來進行增強處理,也可以自行實現(xiàn)一個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()方法進行設(shè)置;

驗證

同時存在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("進入環(huán)繞通知...");

        point.proceed();

    }

}

結(jié)果:

對比

對比維度MethodInterceptorAOP (廣義)
定位AOP 的具體實現(xiàn)組件編程范式/思想
抽象層級具體的技術(shù)實現(xiàn)高層次的設(shè)計理念
標(biāo)準(zhǔn)化AOP Alliance 標(biāo)準(zhǔn)接口無統(tǒng)一標(biāo)準(zhǔn),各框架實現(xiàn)不同

核心差異

特性MethodInterceptor聲明式AOP差異分析
實現(xiàn)方式實現(xiàn)MethodInterceptor接口使用@Aspect注解前者需手動編碼,后者通過元數(shù)據(jù)配置
攔截粒度方法調(diào)用級別控制切入點表達式匹配MethodInterceptor可獲取MethodInvocation完整上下文
執(zhí)行控制顯式調(diào)用invocation.proceed()隱式調(diào)用joinPoint.proceed()前者對執(zhí)行流程控制更直觀
性能開銷△ 較低(直接方法調(diào)用)○ 略高(需解析注解)差異在微秒級,高并發(fā)場景需考慮
適用階段動態(tài)代理支持LTW/CTWAspectJ的編譯時織入能力更強
依賴關(guān)系僅依賴AOP Alliance API依賴具體框架(如Spring AOP)前者更易移植
調(diào)試復(fù)雜度需跟蹤代理鏈切面集中管理聲明式AOP的堆棧信息更友好
動態(tài)能力★★★★ 可運行時修改攔截邏輯★★ 配置后固定MethodInterceptor適合需要熱更新的場景
代碼侵入性目標(biāo)類無需修改但需引入AOP依賴兩者都符合AOP的非侵入理念
典型應(yīng)用場景安全校驗/參數(shù)過濾/熔斷機制日志/事務(wù)/緩存等常規(guī)切面根據(jù)業(yè)務(wù)復(fù)雜度選擇

注:實際使用時建議將圖標(biāo)替換為對應(yīng)的emoji或移除圖標(biāo)標(biāo)記

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java程序常見異常及處理匯總

    Java程序常見異常及處理匯總

    這篇文章主要介紹了java程序常見異常及處理匯總,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-10-10
  • Springboot啟動停止命令的.sh腳本編寫方式

    Springboot啟動停止命令的.sh腳本編寫方式

    這篇文章主要介紹了Springboot啟動停止命令的.sh腳本編寫方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • Spring發(fā)送郵件如何內(nèi)嵌圖片增加附件

    Spring發(fā)送郵件如何內(nèi)嵌圖片增加附件

    這篇文章主要介紹了Spring發(fā)送郵件如何內(nèi)嵌圖片增加附件,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-10-10
  • 如何在Spring MVC中查詢字符串與參數(shù)

    如何在Spring MVC中查詢字符串與參數(shù)

    本文給大家介紹在Spring MVC中查詢字符串與參數(shù)的方法,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2025-09-09
  • 解決項目版本沖突之maven-shade插件使用方式

    解決項目版本沖突之maven-shade插件使用方式

    本文介紹了在Maven項目中如何處理三方依賴與已有依賴沖突的問題,使用maven-shade-plugin插件實現(xiàn)依賴隔離,同時避免版本不一致導(dǎo)致項目異常,通過重命名依賴包名實現(xiàn)不同版本共存,解決三方依賴版本不一致問題,另外還提到了在使用過程中一些坑點和解決方案
    2026-05-05
  • Java使用openssl檢測網(wǎng)站是否支持ocsp

    Java使用openssl檢測網(wǎng)站是否支持ocsp

    OCSP在線證書狀態(tài)協(xié)議是為了替換CRL而提出來的。對于現(xiàn)代web服務(wù)器來說一般都是支持OCSP的,OCSP也是現(xiàn)代web服務(wù)器的標(biāo)配,這篇文章主要介紹了Java使用openssl檢測網(wǎng)站是否支持ocsp,需要的朋友可以參考下
    2022-07-07
  • Spring Boot實現(xiàn)文件上傳示例代碼

    Spring Boot實現(xiàn)文件上傳示例代碼

    本篇文章主要介紹了Spring Boot實現(xiàn)文件上傳示例代碼,可以實現(xiàn)單文件和多文件的上傳,具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2017-03-03
  • 詳解Java中HashSet和TreeSet的區(qū)別

    詳解Java中HashSet和TreeSet的區(qū)別

    這篇文章主要介紹了詳解Java中HashSet和TreeSet的區(qū)別的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • 深入了解Java線程池的原理使用及性能優(yōu)化

    深入了解Java線程池的原理使用及性能優(yōu)化

    JAVA線程池是一種管理和復(fù)用線程資源的機制,可以提高程序的效率和響應(yīng)速度。本文將介紹線程池的原理、使用方法和性能優(yōu)化技巧,幫助讀者深入了解和應(yīng)用JAVA線程池
    2023-04-04
  • SpringMVC如何把后臺文件打印到前臺

    SpringMVC如何把后臺文件打印到前臺

    這篇文章主要介紹了SpringMVC如何把后臺文件打印到前臺,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-09-09

最新評論

于田县| 龙胜| 马山县| 江川县| 全南县| 会东县| 沁水县| 济阳县| 基隆市| 福安市| 江油市| 白朗县| 司法| 宣武区| 昌平区| 峡江县| 开远市| 阆中市| 余江县| 神池县| 通渭县| 手游| 会泽县| 曲阜市| 炎陵县| 旌德县| 句容市| 岳普湖县| 芷江| 平陆县| 中山市| 民县| 福贡县| 宜都市| 瓦房店市| 阜新市| 武鸣县| 庄浪县| 南充市| 曲沃县| 茌平县|