日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

強大!SpringBoot通過三種方式實現(xiàn)AOP切面,第三種方式性能極佳

來源: 責編: 時間:2024-07-09 07:03:31 786觀看
導讀環(huán)境:SpringBoot2.7.181. 簡介Spring框架通過多種機制增強代碼功能,實現(xiàn)切面編程(AOP)。核心之一是通過動態(tài)代理技術(shù),在運行時為Bean織入(動態(tài)代理)額外功能(如日志、安全等),無需修改源代碼。此外,利用Java Agent技術(shù)(如AspectJ

環(huán)境:SpringBoot2.7.18vZa28資訊網(wǎng)——每日最新資訊28at.com

1. 簡介

Spring框架通過多種機制增強代碼功能,實現(xiàn)切面編程(AOP)。核心之一是通過動態(tài)代理技術(shù),在運行時為Bean織入(動態(tài)代理)額外功能(如日志、安全等),無需修改源代碼。此外,利用Java Agent技術(shù)(如AspectJ Weaver),可以在JVM層面攔截類加載過程,動態(tài)修改類字節(jié)碼,從而實現(xiàn)更廣泛的AOP支持。最后,AspectJ-Maven-Plugin編譯插件在編譯時直接修改源代碼或字節(jié)碼,確保切面邏輯與業(yè)務代碼無縫集成,優(yōu)化了性能并減少了運行時開銷。這些技術(shù)使得開發(fā)者能更靈活地管理橫切關(guān)注點,提升代碼模塊性和可維護性。接下來我們將詳細的介紹這3種AOP實現(xiàn)的方式。vZa28資訊網(wǎng)——每日最新資訊28at.com

2. 實戰(zhàn)案例

2.1 準備環(huán)境

Service類

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

接下來的所有示例都將圍繞著上面這個Service。vZa28資訊網(wǎng)——每日最新資訊28at.com

運行測試類

SpringApplication app = new SpringApplication(AppApplication.class) ;app.setWebApplicationType(WebApplicationType.NONE) ;ConfigurableApplicationContext context = app.run(args) ;UserService us = context.getBean(UserService.class) ;us.save() ;

啟動測試類vZa28資訊網(wǎng)——每日最新資訊28at.com

2.2 代理方式

該種方式,是我們工作中用的最為普遍的方式,因為該種方式靈活,無需修改代碼,適用于運行時切面增強,易于理解和集成。如下示例:vZa28資訊網(wǎng)——每日最新資訊28at.com

定義切面

@Component@Aspectpublic class LogAspect {    @Pointcut("execution(* com.pack..*Service.*(..))")  private void log() {}    @Before("log()")  public void before(JoinPoint jp) {    System.out.println("before, " + jp.getSignature()) ;  }}

動態(tài)代理方式,只需要定義上面的切面Bean類。vZa28資訊網(wǎng)——每日最新資訊28at.com

運行測試代碼,輸出結(jié)果

before, void com.pack.aop.agent.UserService.save()save...

通過動態(tài)代理方式,只需要在項目中定義@Aspect切面即可完成增強邏輯。我們將獲取的UserService Class打印如下:vZa28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片vZa28資訊網(wǎng)——每日最新資訊28at.com

通過CGLIB生成了代理類。vZa28資訊網(wǎng)——每日最新資訊28at.com

2.3 Agent增強方式

該種方式是在JVM層面攔截,支持更廣泛的AOP場景,性能優(yōu)化潛力大(相比較于上面代理方式)。要實現(xiàn)這種方式,我們首先需要定義aop.xml文件(META-INF中)vZa28資訊網(wǎng)——每日最新資訊28at.com

<aspectj>  <weaver>    <!-- 對哪些類進行增強 -->    <include within="com.pack.aop.agent..*" />  </weaver>  <!-- 定義切面類,可以定義多個 -->  <aspects>    <aspect name="com.pack.aop.agent.LogAspect" />  </aspects></aspectj>

接下來就運行時還需要配置jvm運行時參數(shù)vZa28資訊網(wǎng)——每日最新資訊28at.com

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

注:這里的版本最后根據(jù)你當前環(huán)境的版本來指定。vZa28資訊網(wǎng)——每日最新資訊28at.com

運行測試代碼:vZa28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片vZa28資訊網(wǎng)——每日最新資訊28at.com

我們的業(yè)務代碼被增強了,同時UserService并沒有創(chuàng)建代理。通過反編譯查看UserService。vZa28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片vZa28資訊網(wǎng)——每日最新資訊28at.com

編譯后的字節(jié)碼也沒有任何的變化。Agent的原理就在進行類加載時對類進行增強。vZa28資訊網(wǎng)——每日最新資訊28at.com

2.4 編譯插件方式

動態(tài)代理的方式,通過對目標類生成代理,在執(zhí)行目標方法前執(zhí)行增強邏輯Advice,這種方式多少對性能是有影響的。而編譯插件方式是在編譯時增強,性能最佳,深度集成,減少運行時開銷。vZa28資訊網(wǎng)——每日最新資訊28at.com

添加maven插件

<plugin>  <groupId>org.codehaus.mojo</groupId>  <artifactId>aspectj-maven-plugin</artifactId>  <version>1.11</version>  <configuration>      <complianceLevel>1.8</complianceLevel>      <source>1.8</source>      <target>1.8</target>      <showWeaveInfo>true</showWeaveInfo>    <Xlint>ignore</Xlint>      <encoding>UTF-8</encoding>      <skip>true</skip>  </configuration>  <executions>      <execution>          <configuration>              <skip>false</skip>          </configuration>          <goals>              <goal>compile</goal>          </goals>      </execution>  </executions></plugin>

接下來我們可以將LogAspect類上的@Component注解刪除了,現(xiàn)在不需要了。重新編譯項目vZa28資訊網(wǎng)——每日最新資訊28at.com

mvn clean compile

再次運行測試代碼;vZa28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片vZa28資訊網(wǎng)——每日最新資訊28at.com

我們的代碼同樣被增強了,同時打印了UserService類,該類并沒有被代理。反編譯該類。vZa28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片vZa28資訊網(wǎng)——每日最新資訊28at.com

通過反編譯得知,在編譯階段就對我們的代碼進行了增強。這也是此種方式性能最佳的原因。vZa28資訊網(wǎng)——每日最新資訊28at.com

總結(jié):以上三種方式增強代碼:動態(tài)代理靈活輕量,運行時織入;Java Agent在JVM層面攔截類加載,支持廣泛AOP場景,性能優(yōu)化潛力大但配置相對復雜;AspectJ-Maven-Plugin編譯時修改字節(jié)碼,減少運行時開銷,支持復雜邏輯但需重新編譯。vZa28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-99647-0.html強大!SpringBoot通過三種方式實現(xiàn)AOP切面,第三種方式性能極佳

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 我讓代碼,學會了自動評審!提高80%的交付質(zhì)量!

下一篇: 淺談Node.js核心組件

標簽:
  • 熱門焦點
  • 小米平板5 Pro 12.4簡評:多專多能 兼顧影音娛樂的大屏利器

    疫情帶來了網(wǎng)課,網(wǎng)課盤活了安卓平板,安卓平板市場雖然中途停滯了幾年,但好的一點就是停滯的這幾年行業(yè)又有了新的發(fā)展方向,例如超窄邊框、高刷新率、多攝鏡頭組合等,這就讓安卓
  • Redmi Buds 4開箱簡評:才199還有降噪 可以無腦入

    在上個月舉辦的Redmi Note11T Pro系列新機發(fā)布會上,除了兩款手機新品之外,Redmi還帶來了兩款TWS真無線藍牙耳機產(chǎn)品,Redmi Buds 4和Redmi Buds 4 Pro,此前我們在Redmi Note11T
  • 天貓精靈Sound Pro體驗:智能音箱沒有音質(zhì)?來聽聽我的

    這幾年除了手機作為智能生活終端最主要的核心之外,第二個可以成為中心點的產(chǎn)品是什么?——是智能音箱。 手機在執(zhí)行命令的時候有兩種操作方式,手和智能語音助手,而智能音箱只
  • 如何通過Python線程池實現(xiàn)異步編程?

    線程池的概念和基本原理線程池是一種并發(fā)處理機制,它可以在程序啟動時創(chuàng)建一組線程,并將它們置于等待任務的狀態(tài)。當任務到達時,線程池中的某個線程會被喚醒并執(zhí)行任務,執(zhí)行完任
  • 19個 JavaScript 單行代碼技巧,讓你看起來像個專業(yè)人士

    今天這篇文章跟大家分享18個JS單行代碼,你只需花幾分鐘時間,即可幫助您了解一些您可能不知道的 JS 知識,如果您已經(jīng)知道了,就當作復習一下,古人云,溫故而知新嘛。現(xiàn)在,我們就開始今
  • 一文掌握 Golang 模糊測試(Fuzz Testing)

    模糊測試(Fuzz Testing)模糊測試(Fuzz Testing)是通過向目標系統(tǒng)提供非預期的輸入并監(jiān)視異常結(jié)果來發(fā)現(xiàn)軟件漏洞的方法。可以用來發(fā)現(xiàn)應用程序、操作系統(tǒng)和網(wǎng)絡協(xié)議等中的漏洞或
  • 從零到英雄:高并發(fā)與性能優(yōu)化的神奇之旅

    作者 | 波哥審校 | 重樓作為公司的架構(gòu)師或者程序員,你是否曾經(jīng)為公司的系統(tǒng)在面對高并發(fā)和性能瓶頸時感到手足無措或者焦頭爛額呢?筆者在出道那會為此是吃盡了苦頭的,不過也得
  • 東方甄選單飛:有些鳥注定是關(guān)不住的

    文/彭寬鴻編輯/羅卿東方甄選創(chuàng)始人俞敏洪帶隊的&ldquo;7天甘肅行&rdquo;直播活動已在近日順利收官。成立后一年多時間里,東方甄選要脫離抖音自立門戶的傳聞不絕于耳,&ldquo;7
  • 東方甄選單飛:有些鳥注定是關(guān)不住的

    作者:彭寬鴻來源:華爾街科技眼&zwj;&zwj;&zwj;&zwj;&zwj;&zwj;&zwj;&zwj;&zwj;&zwj;東方甄選創(chuàng)始人俞敏洪帶隊的&ldquo;7天甘肅行&rdquo;直播活動已在近日順利收官。成立后一
Top 主站蜘蛛池模板: 南通市| 繁峙县| 平陆县| 阜新| 瓮安县| 达尔| 枣阳市| 来宾市| 车险| 错那县| 鄱阳县| 沽源县| 得荣县| 孙吴县| 大渡口区| 蓬莱市| 阳新县| 报价| 和田市| 家居| 洪雅县| 德保县| 惠来县| 舞阳县| 大余县| 广德县| 宿迁市| 霍州市| 秀山| 南乐县| 旌德县| 麟游县| 洞口县| 涿鹿县| 福州市| 蒲江县| 洛扎县| 延寿县| 阳西县| 瑞丽市| 台南市|