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

SpringBoot實現(xiàn)AOP切面的三種方式

 更新時間:2024年08月01日 08:52:50   作者:碼到三十五  
Spring,SpringBoot框架憑借多種高效機制,顯著增強了代碼的功能性,并實現(xiàn)了切面編程(AOP)的精髓,其核心亮點之一,是運用動態(tài)代理技術(shù),無需觸動源代碼即可在Bean的運行時為其動態(tài)織入額外功能,本文給大家介紹了SpringBoot通過3種方式實現(xiàn)AOP切面,需要的朋友可以參考下

前言

Spring,SpringBoot框架憑借多種高效機制,顯著增強了代碼的功能性,并實現(xiàn)了切面編程(AOP)的精髓。其核心亮點之一,是運用動態(tài)代理技術(shù),無需觸動源代碼即可在Bean的運行時為其動態(tài)織入額外功能,如日志記錄、安全驗證等,從而實現(xiàn)非侵入式的代碼增強。

此外,Java Agent技術(shù),以AspectJ Weaver為代表,在JVM層面上大顯身手,攔截類加載過程并動態(tài)修改類字節(jié)碼。這一技術(shù)不僅拓展了AOP的應(yīng)用場景,還蘊含了巨大的性能優(yōu)化潛力,為開發(fā)者提供了更多元化的AOP實現(xiàn)方式。

AspectJ-Maven-Plugin編譯插件則采取了另辟蹊徑的方法。它在編譯階段直接對源代碼或字節(jié)碼進行修改,確保切面邏輯與業(yè)務(wù)代碼的無縫融合。這種方式不僅優(yōu)化了程序的性能,還大幅減少了運行時的開銷,為復(fù)雜的業(yè)務(wù)邏輯提供了堅實的支撐。

1. 使用動態(tài)代理實現(xiàn)AOP

定義:AOP是一種編程范式,用于將橫切關(guān)注點(如日志、安全、事務(wù)管理等)從業(yè)務(wù)邏輯中分離出來,形成獨立的模塊。這樣可以減少代碼的冗余,提高代碼的可維護性和模塊性。

特點:

  • 關(guān)注點分離:將橫切關(guān)注點與業(yè)務(wù)邏輯分離。
  • 提高代碼復(fù)用:橫切關(guān)注點可以被多個地方復(fù)用。
  • 減少代碼冗余:避免了在多個地方重復(fù)編寫相同的代碼。

通過動態(tài)代理方式,只需要在項目中定義@Aspect切面即可完成增強邏輯,利用CGLIB生成了代理類。

切面類代碼

@Aspect
@Component
public class LoggingAspect {

    // 定義切點
    @Pointcut("execution(* com.example.service.*.*(..))")
    public void serviceLayerExecution(){}

    // 在切點方法執(zhí)行前執(zhí)行
    @Before("serviceLayerExecution()")
    public void logBeforeServiceMethod(JoinPoint joinPoint) {
        System.out.println("Before method: " + joinPoint.getSignature().getName());
    }

    // 可以繼續(xù)添加其他類型的通知,如@After、@AfterReturning、@AfterThrowing、@Around等
}

服務(wù)類代碼

@Service
public class UserService {
    public void save() {
        System.out.println("Saving user...");
    }
}

2. 使用Java Agent技術(shù)實現(xiàn)AOP(AspectJ Weaver)

定義:Java Agent技術(shù)允許開發(fā)者在JVM層面攔截類加載過程,動態(tài)修改類字節(jié)碼。這種技術(shù)通過Java Instrumentation API實現(xiàn)。

應(yīng)用場景

  • AOP支持:利用Java Agent技術(shù)(如AspectJ Weaver),可以在JVM層面攔截類加載過程,動態(tài)修改類字節(jié)碼,實現(xiàn)更廣泛的AOP支持。
  • 性能優(yōu)化:通過動態(tài)修改字節(jié)碼,可以優(yōu)化類的執(zhí)行性能。
  • 動態(tài)監(jiān)控與調(diào)試:在類加載時注入監(jiān)控或調(diào)試代碼。

特點

  • 廣泛支持:支持在JVM層面進行類加載的攔截和修改。
  • 配置復(fù)雜:相比其他AOP實現(xiàn)方式,配置可能更為復(fù)雜。

使用Java Agent技術(shù)涉及到更復(fù)雜的配置,

包括編寫自定義的Agent類,主要步驟包括將AspectJ Weaver作為Java Agent運行。下面看看aop.xml和切面類的配置。

aop.xml(放在META-INF目錄下):

<aspectj>
    <weaver>
        <!-- 指定哪些包下的類需要被織入 -->
        <include within="com.example.service..*"/>
    </weaver>
    <aspects>
        <!-- 指定切面類,可定義多個 -->
        <aspect name="com.example.aspect.LoggingAspect"/>
    </aspects>
</aspectj>

切面類代碼(與動態(tài)代理類似,但不需要@Component注解):

@Aspect
public class LoggingAspect {
    // 與動態(tài)代理相同的切點和通知定義
    @Pointcut("execution(* com.example.service.*.*(..))")
    public void serviceLayerExecution(){}

    @Before("serviceLayerExecution()")
    public void logBeforeServiceMethod(JoinPoint joinPoint) {
        // 日志記錄邏輯
    }
}

** 指定JVM參數(shù) **
使用Java Agent時,需要在JVM啟動參數(shù)中指定AspectJ Weaver的jar包

-javaagent:d:/maven/org/aspectj/aspectjweaver/1.9.7/aspectjweaver-1.9.7.jar

通過以上實現(xiàn), 我們的SpringBoot業(yè)務(wù)代碼UserService 被增強了,同時UserService并沒有創(chuàng)建代理。通過反編譯查看UserService編譯后的字節(jié)碼也沒有任何的變化。Agent的原理就在進行類加載時對類進行增強。

3. 使用AspectJ編譯時織入實現(xiàn)AOP

定義:AspectJ-Maven-Plugin是一個Maven編譯插件,用于在編譯時直接修改源代碼或字節(jié)碼,以集成切面邏輯。

應(yīng)用場景

  • AOP集成:通過編譯時修改字節(jié)碼,實現(xiàn)切面邏輯與業(yè)務(wù)代碼的無縫集成。
  • 性能優(yōu)化:由于是在編譯階段進行代碼的增強,因此減少了運行時的開銷,提升了性能。

特點

  • 性能最佳:編譯時增強減少了運行時的開銷。
  • 深度集成:切面邏輯與業(yè)務(wù)代碼無縫集成。
  • 需要重新編譯:每當(dāng)切面邏輯或業(yè)務(wù)代碼發(fā)生變化時,都需要重新編譯項目。

SpringBoot中,動態(tài)代理的方式,通過對目標類生成代理,在執(zhí)行目標方法前執(zhí)行增強邏輯Advice,這種方式多少對性能是有影響的。而編譯插件方式是在編譯時增強,性能最佳,深度集成,減少運行時開銷。

pom.xml中添加AspectJ-Maven-Plugin

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>aspectj-maven-plugin</artifactId>
    <version>1.11</version>
    <configuration>
        <showWeaveInfo>true</showWeaveInfo>
        <aspectLibraries>
            <aspectLibrary>
                <groupId>com.example</groupId>
                <artifactId>your-aspect-library</artifactId>
            </aspectLibrary>
        </aspectLibraries>
    </configuration>
    <executions>
        <execution>
            <goals>
                <goal>compile</goal> <!-- use this goal to weave all your main classes -->
                <goal>test-compile</goal> <!-- use this goal to weave all your test classes -->
            </goals>
        </execution>
    </executions>
</plugin>

注意:如果切面類位于同一項目中,不需要單獨指定aspectLibraries。

切面類代碼(與動態(tài)代理相同,不需要@Component注解):

…省略很多代碼…

總結(jié)

  • AOP:是一種編程范式,用于將橫切關(guān)注點從業(yè)務(wù)邏輯中分離出來,提高代碼的可維護性和模塊性。
  • Java Agent:在JVM層面攔截類加載過程,動態(tài)修改類字節(jié)碼,支持廣泛的AOP場景,但配置可能較為復(fù)雜。
  • AspectJ-Maven-Plugin:是一個Maven編譯插件,通過編譯時修改字節(jié)碼來集成切面邏輯,性能最佳,但需要重新編譯項目。

到此這篇關(guān)于SpringBoot實現(xiàn)AOP切面的三種方式的文章就介紹到這了,更多相關(guān)SpringBoot實現(xiàn)AOP切面內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Jetbrains系列產(chǎn)品重置試用思路詳解

    Jetbrains系列產(chǎn)品重置試用思路詳解

    這篇文章主要介紹了Jetbrains系列產(chǎn)品重置試用思路詳解,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • Java ScheduledExecutorService定時任務(wù)案例講解

    Java ScheduledExecutorService定時任務(wù)案例講解

    這篇文章主要介紹了Java ScheduledExecutorService定時任務(wù)案例講解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • Java實現(xiàn)中國象棋游戲

    Java實現(xiàn)中國象棋游戲

    這篇文章主要為大家詳細介紹了Java實現(xiàn)中國象棋游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • Springboot?前后端分離項目使用?POI?生成并導(dǎo)出?Excel的操作方法

    Springboot?前后端分離項目使用?POI?生成并導(dǎo)出?Excel的操作方法

    在做一個?SpringBoot?前后端分離項目的時候,需要將數(shù)據(jù)存到?Excel中,用戶可以下載?Excel,具體實現(xiàn)是采用?Apache?強大的?POI,本文給大家介紹Springboot?前后端分離項目使用?POI?生成并導(dǎo)出?Excel相關(guān)知識,感興趣的朋友一起看看吧
    2023-09-09
  • Springboot?引入?Redis?并配置序列化并封裝RedisTemplate?

    Springboot?引入?Redis?并配置序列化并封裝RedisTemplate?

    這篇文章主要介紹了Springboot?引入?Redis?并配置序列化并封裝RedisTemplate。文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-09-09
  • Java中數(shù)組轉(zhuǎn)list的兩種簡單實現(xiàn)方式

    Java中數(shù)組轉(zhuǎn)list的兩種簡單實現(xiàn)方式

    這篇文章主要介紹了兩種將數(shù)組轉(zhuǎn)換為List的方法,兩種方法分別是使用Arrays.asList()方法和使用ArrayList構(gòu)造函數(shù),文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2025-03-03
  • Java連接Sql數(shù)據(jù)庫經(jīng)常用到的操作

    Java連接Sql數(shù)據(jù)庫經(jīng)常用到的操作

    這篇文章主要介紹了Java連接Sql數(shù)據(jù)庫經(jīng)常用到的操作的相關(guān)資料,需要的朋友可以參考下
    2016-02-02
  • 詳解Java線性結(jié)構(gòu)中的鏈表

    詳解Java線性結(jié)構(gòu)中的鏈表

    除了一些算法之外,我們還有掌握一些常見的數(shù)據(jù)結(jié)構(gòu),比如數(shù)組、鏈表、棧、隊列、樹等結(jié)構(gòu),所以接下來就給大家詳細講解一下線性結(jié)構(gòu)中的鏈表,需要的朋友可以參考下
    2023-07-07
  • java-RGB調(diào)色面板的實現(xiàn)(事件監(jiān)聽器之匿名內(nèi)部類)

    java-RGB調(diào)色面板的實現(xiàn)(事件監(jiān)聽器之匿名內(nèi)部類)

    這篇文章主要介紹了java-RGB調(diào)色面板的實現(xiàn)(事件監(jiān)聽器之匿名內(nèi)部類),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • Spring Boot自定義配置屬性源(PropertySource)

    Spring Boot自定義配置屬性源(PropertySource)

    這篇文章主要介紹了Spring Boot自定義配置屬性源(PropertySource),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-06-06

最新評論

剑川县| 尼勒克县| 呼图壁县| 松桃| 云霄县| 射洪县| 中江县| 宜都市| 肇庆市| 安远县| 方城县| 沂南县| 普兰店市| 南靖县| 五河县| 襄汾县| 哈巴河县| 平江县| 广宗县| 清镇市| 梨树县| 隆安县| 长治县| 赫章县| 哈尔滨市| 潼关县| 肇东市| 象州县| 哈密市| 来凤县| 尼玛县| 泰兴市| 道孚县| 阳原县| 胶南市| 永仁县| 元江| 桓台县| 宣汉县| 河西区| 公主岭市|