日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

aspectj切面织入

發布時間:2023/12/20 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 aspectj切面织入 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、介紹

AspectJ 是一個 AOP 的具體實現框架。AOP(Aspect Oriented Programming)即面向切面編程,可以通過預編譯方式和運行期動態代理實現在不修改源代碼的情況下給程序動態統一添加功能的一種技術。AspectJ不但可以通過預編譯方式(CTW)和運行期動態代理的方式織入切面,還可以在載入(Load Time Weaving, LTW)時織入。AspectJ 擴展了Java,定義了一些專門的AOP語法。

靜態代理唯一的缺點就是我們需要對每一個方法編寫我們的代理邏輯,造成了工作的繁瑣和復雜。AspectJ就是為了解決這個問題,在編譯成class字節碼的時候在方法周圍加上業務邏輯。復雜的工作由特定的編譯器幫我們做,而 aspectj-maven-plugin 插件即可幫我們完成靜態編譯代理。

aspectj-maven-plugin 的相關介紹 aspectj-maven-plugin 的相關介紹, 對應的GitHub 地址 GitHub地址

aspectj-maven-plugin 插件是在 編譯階段 compile 對文件進行增強,可以從 生成的.class 文件可以看出.

二、靜態編譯代理

靜態編譯代理依賴ajc編譯器,通過maven插件支持。

  • 靜態代理所需要的配置:aspectj-maven-plugin插件
  • 并且如果切面來源于三方jar包并且需要對當前項目代碼做代理,那么需要通過配置指定插件中的AspectLibrary屬性來指定三方包來達到當前項目的增強,切面就是定義在當前項目則無需此操作
  • 依賴AspectjTool 工具包

maven插件如下所示:

<plugin><groupId>org.codehaus.mojo</groupId><artifactId>aspectj-maven-plugin</artifactId><version>1.10</version><configuration><source>1.8</source><target>1.8</target><encoding>UTF-8</encoding><complianceLevel>1.8</complianceLevel><verbose>true</verbose><showWeaveInfo>true</showWeaveInfo><aspectLibraries><aspectLibrary><groupId>com.example.pastor</groupId><artifactId>metric-reportor</artifactId></aspectLibrary></aspectLibraries></configuration><executions><execution><goals><goal>compile</goal><goal>test-compile</goal></goals></execution></executions> </plugin>

1、案例一

(1)pom.xml

<dependencies><!-- https://mvnrepository.com/artifact/org.aspectj/aspectjrt --><dependency><groupId>org.aspectj</groupId><artifactId>aspectjrt</artifactId><version>1.8.13</version></dependency><!-- 這個包不用引入,否則切面織入失敗 --><!--<dependency><groupId>org.aspectj</groupId><artifactId>aspectjtools</artifactId><version>1.8.13</version></dependency>--></dependencies><!--<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>--><build><plugins><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><!-- 注意:IDEA下這個值要設置為false,否則運行程序時IDEA會再次編譯,導致aspectj-maven-plugin編譯的結果被覆蓋 --><skip>false</skip></configuration><executions><execution><configuration><skip>false</skip></configuration><goals><goal>compile</goal></goals></execution></executions></plugin></plugins></build>

(2)業務方法

package com.scy.example.aspectj;public class UserServiceEnd {public void printLog() {System.out.println(" no param.....");} }

(3)切面代碼

package com.scy.example.aspectj;import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before;@Aspect public class MethodEndAspect {@Before("execution(* com.scy.example.aspectj.UserServiceEnd.printLog())")public void setStartTimeInThreadLocal(JoinPoint joinPoint) {System.out.println("before ...");}}

(4)編譯

輸入 編譯命令,mvn clean compile

PS E:\IdeaProjectSun\example> mvn clean compile [INFO] Scanning for projects... [INFO] [INFO] --------------------------< com.scy:example >--------------------------- [INFO] Building example 0.0.1-SNAPSHOT [INFO] --------------------------------[ jar ]--------------------------------- [INFO] [INFO] --- maven-clean-plugin:3.1.0:clean (default-clean) @ example --- [INFO] Deleting E:\IdeaProjectSun\example\target [INFO] [INFO] --- maven-resources-plugin:3.1.0:resources (default-resources) @ example --- [INFO] Using 'UTF-8' encoding to copy filtered resources. [INFO] Copying 1 resource [INFO] Copying 16 resources [INFO] [INFO] --- maven-compiler-plugin:3.8.1:compile (default-compile) @ example --- [INFO] Changes detected - recompiling the module! [INFO] Compiling 8 source files to E:\IdeaProjectSun\example\target\classes [INFO] [INFO] --- aspectj-maven-plugin:1.11:compile (default) @ example --- [INFO] Showing AJC message detail for messages of types: [error, warning, fail] [INFO] Join point 'method-execution(void com.scy.example.aspectj.UserServiceEnd.printLog())' in Type 'com.scy.example.aspectj.UserServiceEnd' (UserServiceEnd.java:4 ) advised by before advice from 'com.scy.example.aspectj.MethodEndAspect' (MethodEndAspect.java:11) [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 2.306 s [INFO] Finished at: 2022-09-02T14:41:07+08:00 [INFO] ------------------------------------------------------------------------

(5)查看反編譯的class文件

// // Source code recreated from a .class file by IntelliJ IDEA // (powered by FernFlower decompiler) //package com.scy.example.aspectj;import org.aspectj.lang.JoinPoint; import org.aspectj.runtime.reflect.Factory;public class UserServiceEnd {public UserServiceEnd() {}public void printLog() {JoinPoint var1 = Factory.makeJP(ajc$tjp_0, this, this);MethodEndAspect.aspectOf().setStartTimeInThreadLocal(var1);System.out.println(" no param.....");}static {ajc$preClinit();} }

(6)運行結果

before ...no param.....

2、案例二

對pom.xml 進行優化,其他不變。

<dependencies><!-- https://mvnrepository.com/artifact/org.aspectj/aspectjrt --><dependency><groupId>org.aspectj</groupId><artifactId>aspectjrt</artifactId><version>1.8.13</version></dependency><!-- https://mvnrepository.com/artifact/org.aspectj/aspectjtools --><dependency><groupId>org.aspectj</groupId><artifactId>aspectjtools</artifactId><version>1.8.13</version></dependency></dependencies><!--<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>--><build><plugins><plugin><groupId>org.codehaus.mojo</groupId><artifactId>aspectj-maven-plugin</artifactId><version>1.11</version><configuration><complianceLevel>1.8</complianceLevel><source>1.8</source></configuration><executions><execution><goals><goal>compile</goal><goal>test-compile</goal></goals></execution></executions></plugin></plugins></build>

三、LoadTimeWeave加載期織入增強

加載類文件時通過instrument包去修改字節碼來插入增強邏輯

  • 首先要通過@EnableLoadTimeWeaving(aspectjWeaving = EnableLoadTimeWeaving.AspectJWeaving.AUTODETECT)
  • 其次要在項目啟動參數上要通過探針指定instrument包來動態修改織入
  • 在spring boot應用加上此配置來讓應用去讀取META-INF目錄下的aop.xml讀取切面已經要織入的路徑配置(目前此配置在監控的sdk中我已經定義配置好)

工程配置類開啟LTW

@EnableLoadTimeWeaving(aspectjWeaving = EnableLoadTimeWeaving.AspectJWeaving.AUTODETECT) 1

java探針啟動參數

-javaagent:spring-instrument-5.2.5.RELEASE.jar 1

然后在類路徑下META-INF下面提供aop描述文件aop.xml,描述待織入的類路徑和切面類所在位置

<!DOCTYPE aspectj PUBLIC "-//AspectJ//DTD//EN" "http://www.eclipse.org/aspectj/dtd/aspectj.dtd"> <aspectj><weaver options="-showWeaveInfo -verbose"><include within="com.example.ltw.entity.*"/><include within="com.example.ltw.service.*"/></weaver><aspects><aspect name="com.example.ltw.ProfilingAspect"/><aspect name="com.qiyi.pastor.metricreportor.report.PastorReportAop"/></aspects> </aspectj>

四、小結

  • Aspectj并不是動態的在運行時生成代理類,而是在編譯的時候就植入代碼到class文件
  • 由于是靜態織入的,所以性能相對來說比較好
  • Aspectj不受類的特殊限制,不管方法是private、或者static、或者final的,都可以代理
  • Aspectj不會代理除了限定方法之外任何其他諸如toString(),clone()等方法

五、參考

https://blog.csdn.net/healist/article/details/108824428

基于使用AspectJ實現AOP,注解AOP開發(基于xml文件、基于注解)_杭州小哥哥的博客-CSDN博客

總結

以上是生活随笔為你收集整理的aspectj切面织入的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 中国浓毛少妇毛茸茸 | 国产激情一区二区三区视频免樱桃 | 91精品国产一区 | 国产区福利 | 波多野结衣www | 国产精品免费视频一区二区三区 | 精品一区二区免费看 | 六月色婷婷 | 97在线观视频免费观看 | 狠狠干视频网 | 中文日本在线 | 国产91黄色 | 色呦呦国产 | 国产精品国产精品国产专区蜜臀ah | 特黄视频免费看 | 人妻在客厅被c的呻吟 | 男人的天堂2018 | 精品人妻一区二区三区浪潮在线 | www五月天com | 亚洲爆乳无码一区二区三区 | 日本一区二区视频在线播放 | 欧美另类v| 亚洲美女视频 | 天天射干| 国产自产 | 青青草公开视频 | 日韩精品激情 | 加勒比视频在线观看 | 久久久久久av | 天天拍天天干 | 中文字幕啪啪 | 福利社区一区二区 | 综合五月婷 | 中文有码一区 | 日本www免费 | 亚洲一区二区三区视频在线 | 羞羞在线观看 | 波多野结衣喷潮 | 欧美a级肉欲大片xxx | 好吊视频一区二区三区四区 | 99热com | 麻豆视频在线 | 一级黄色播放 | 六月色丁香 | 肌肉猛男裸体gay网站免费 | 欧美成人秋霞久久aa片 | 亚洲美女毛片 | 欧美国产在线看 | 欧美性一区 | 午夜性色 | 日韩欧美成人一区二区三区 | 99青草 | 亚洲精品美女视频 | 成人在线黄色 | 免费看一级一片 | 操人在线观看 | 毛片亚洲av无码精品国产午夜 | 国产传媒av | 欧美一区二区三区四区五区六区 | 国产激情成人 | 国产中文字幕久久 | 一级片亚洲 | 久久社区视频 | 日韩二区在线观看 | 精品国产区 | 精品久久久久一区二区国产 | 激情天堂网 | 亚洲蜜臀av乱码久久精品蜜桃 | 精品人妻伦一区二区三区久久 | 亚洲高清在线看 | 一区二区自拍偷拍 | 欧美一区三区三区高中清蜜桃 | 久久99精品国产麻豆婷婷洗澡 | 精品夜夜澡人妻无码av | 欧美乱大交| 国产女教师bbwbbwbbw | 欧美 日韩 中文字幕 | 中国成人av | 一级片亚洲 | 国产精品欧美激情在线 | 天天av天天 | 96久久| 在线免费日韩 | 成人欧美一区二区三区黑人孕妇 | 波多野结衣99 | 超碰国产人人 | 手机电影在线观看 | 天天爽天天射 | 超碰97人 | 国产乱码一区二区三区在线观看 | 蜜桃视频在线观看一区二区 | 成年人色片 | 免费成人黄 | 国产调教视频 | 丰满少妇在线观看网站 | 三级网站在线播放 | 欧美色淫| 免费毛片观看 | 日美毛片|