AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當(dāng)前位置:首頁(yè) > 科技  > 軟件

強(qiáng)大!SpringBoot通過(guò)三種方式實(shí)現(xiàn)AOP切面,第三種方式性能極佳

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

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

1. 簡(jiǎn)介

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

2. 實(shí)戰(zhàn)案例

2.1 準(zhǔn)備環(huán)境

Service類(lèi)

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

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

運(yùn)行測(cè)試類(lèi)

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

啟動(dòng)測(cè)試類(lèi)KG928資訊網(wǎng)——每日最新資訊28at.com

2.2 代理方式

該種方式,是我們工作中用的最為普遍的方式,因?yàn)樵摲N方式靈活,無(wú)需修改代碼,適用于運(yùn)行時(shí)切面增強(qiáng),易于理解和集成。如下示例:KG928資訊網(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()) ;  }}

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

運(yùn)行測(cè)試代碼,輸出結(jié)果

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

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

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

通過(guò)CGLIB生成了代理類(lèi)。KG928資訊網(wǎng)——每日最新資訊28at.com

2.3 Agent增強(qiáng)方式

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

<aspectj>  <weaver>    <!-- 對(duì)哪些類(lèi)進(jìn)行增強(qiáng) -->    <include within="com.pack.aop.agent..*" />  </weaver>  <!-- 定義切面類(lèi),可以定義多個(gè) -->  <aspects>    <aspect name="com.pack.aop.agent.LogAspect" />  </aspects></aspectj>

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

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

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

運(yùn)行測(cè)試代碼:KG928資訊網(wǎng)——每日最新資訊28at.com

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

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

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

編譯后的字節(jié)碼也沒(méi)有任何的變化。Agent的原理就在進(jìn)行類(lèi)加載時(shí)對(duì)類(lèi)進(jìn)行增強(qiáng)。KG928資訊網(wǎng)——每日最新資訊28at.com

2.4 編譯插件方式

動(dòng)態(tài)代理的方式,通過(guò)對(duì)目標(biāo)類(lèi)生成代理,在執(zhí)行目標(biāo)方法前執(zhí)行增強(qiáng)邏輯Advice,這種方式多少對(duì)性能是有影響的。而編譯插件方式是在編譯時(shí)增強(qiáng),性能最佳,深度集成,減少運(yùn)行時(shí)開(kāi)銷(xiāo)。KG928資訊網(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>

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

mvn clean compile

再次運(yùn)行測(cè)試代碼;KG928資訊網(wǎng)——每日最新資訊28at.com

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

我們的代碼同樣被增強(qiáng)了,同時(shí)打印了UserService類(lèi),該類(lèi)并沒(méi)有被代理。反編譯該類(lèi)。KG928資訊網(wǎng)——每日最新資訊28at.com

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

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

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

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

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

上一篇: 我讓代碼,學(xué)會(huì)了自動(dòng)評(píng)審!提高80%的交付質(zhì)量!

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

標(biāo)簽:
  • 熱門(mén)焦點(diǎn)
Top