成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

非Spring管理Bean如何添加AOP呢?

開發 前端
首先要清楚的是AOP的底層實現原理就是字節碼,我們只需要從字節碼層面,就一定可以解決這樣的問題。因此可以利用編譯期增強和運行期增強,常見的方案有兩種,一種Java Agent技術,另一種 AspectJ方案。

[[357003]]

 前幾天有個朋友問了一個問題,覺得可以給大家分享一下。

問題如下圖

歸其根本這是個歷史項目,里面有很多的類并沒有交給spring管理,但現在需要統一添加日志。

面對這樣的問題,其實只要了解AOP的原理,就會有多種方法。AOP都是基于動態代理來實現,而動態代理常見的就是cglib和java動態代理,不了解的可以看下之前干貨君寫的文章

  • java動態代理為什么需要基于接口
  • cglib動態代理對類沒有任何限制嗎?

但此兩種方法似乎在這樣的場景不好實現,需要修改大量的代碼,那么有沒有什么好的方案呢?

答案當然是有。

首先要清楚的是AOP的底層實現原理就是字節碼,我們只需要從字節碼層面,就一定可以解決這樣的問題。因此可以利用編譯期增強和運行期增強,常見的方案有兩種,一種Java Agent技術,另一種 AspectJ方案。

Java Agent

Java Agent中文名字叫做java 探針,可以在運行java時指定探針程序,對原程序無侵入,常見的一些APM工具都會這樣,如skywalking,后續有機會給大家介紹下。如下圖


java agent的主要原理就是利用JVMTI(JVM Tool Interface),JVM用來暴露一些供用戶擴展的接口集合,因此可以在此處做一些運行期字節碼增強。

Java Agent內容比較多,有很多大家熟悉的工具都是基于它去做的,例如阿里的arthas。本文就不介紹了,后期會給大家詳細介紹下Java Agent。

AspectJ方案

可以利用aspectj + javac來編譯織入代碼,也可以利用maven插件aspectj-maven-plugin,下面利用AspectJ注解 + aspectj-maven-plugin來實戰一下。

aspectj-maven-plugin官網 http://www.mojohaus.org/aspectj-maven-plugin/usage.html

引入依賴

編譯增強,依賴此jar

 

  1. import org.aspectj.lang.annotation.Aspect; 
  2.  
  3. import org.aspectj.lang.annotation.Before; 
  4.  
  5. import org.aspectj.lang.annotation.Pointcut; 
  6.  
  7. @Aspect 
  8.  
  9. public class Aop { 
  10.  
  11.  
  12.  
  13. @Pointcut("execution(* com.ganhuojun.gracefulshutdown.controller..*.*(..))"
  14.  
  15. public void pointcut1(){ 
  16.  
  17.  
  18.  
  19.  
  20.  
  21.  
  22. @Before("pointcut1()"
  23.  
  24. public void before(){ 
  25.  
  26. System.out.println("controller before"); 
  27.  
  28.  

 

定義注解

注意:該注解不要交給spring管理

  1. <plugin> 
  2.  
  3. <groupId>org.codehaus.mojo</groupId> 
  4.  
  5. <artifactId>aspectj-maven-plugin</artifactId> 
  6.  
  7. <version>1.11</version> 
  8.  
  9. <configuration> 
  10.  
  11. <complianceLevel>1.8</complianceLevel> 
  12.  
  13. <source>1.8</source> 
  14.  
  15. <!--<showWeaveInfo>true</showWeaveInfo>--> 
  16.  
  17. <!--<Xlint>ignore</Xlint>--> 
  18.  
  19. <encoding>UTF-8</encoding> 
  20.  
  21. <sources> 
  22.  
  23. <source> 
  24.  
  25. <basedir>src/main/java</basedir> 
  26.  
  27. <!--此處使用include一致會導致織入失敗,暫時未找到好的解決辦法,不寫則引用所有的Aspect--> 
  28.  
  29. <!--<includes>--> 
  30.  
  31. <!--<include>**/Aop.java</include>--> 
  32.  
  33. <!--<include>**/ControllerAop.aj</include>--> 
  34.  
  35. <!--</includes>--> 
  36.  
  37. <excludes> 
  38.  
  39. <exclude>**/ServiceAop.java</exclude> 
  40.  
  41. </excludes> 
  42.  
  43. </source> 
  44.  
  45. </sources> 
  46.  
  47. </configuration> 
  48.  
  49. <executions> 
  50.  
  51. <execution> 
  52.  
  53. <goals> 
  54.  
  55. <goal>compile</goal> 
  56.  
  57. </goals> 
  58.  
  59. </execution> 
  60.  
  61. </executions> 
  62.  
  63. </plugin> 

 

 配置maven插件

  1. <plugin> 
  2.  
  3. <groupId>org.codehaus.mojo</groupId> 
  4.  
  5. <artifactId>aspectj-maven-plugin</artifactId> 
  6.  
  7. <version>1.11</version> 
  8.  
  9. <configuration> 
  10.  
  11. <complianceLevel>1.8</complianceLevel> 
  12.  
  13. <source>1.8</source> 
  14.  
  15. <!--<showWeaveInfo>true</showWeaveInfo>--> 
  16.  
  17. <!--<Xlint>ignore</Xlint>--> 
  18.  
  19. <encoding>UTF-8</encoding> 
  20.  
  21. <sources> 
  22.  
  23. <source> 
  24.  
  25. <basedir>src/main/java</basedir> 
  26.  
  27. <!--此處使用include一致會導致織入失敗,暫時未找到好的解決辦法,不寫則引用所有的Aspect--> 
  28.  
  29. <!--<includes>--> 
  30.  
  31. <!--<include>**/Aop.java</include>--> 
  32.  
  33. <!--<include>**/ControllerAop.aj</include>--> 
  34.  
  35. <!--</includes>--> 
  36.  
  37. <excludes> 
  38.  
  39. <exclude>**/ServiceAop.java</exclude> 
  40.  
  41. </excludes> 
  42.  
  43. </source> 
  44.  
  45. </sources> 
  46.  
  47. </configuration> 
  48.  
  49. <executions> 
  50.  
  51. <execution> 
  52.  
  53. <goals> 
  54.  
  55. <goal>compile</goal> 
  56.  
  57. </goals> 
  58.  
  59. </execution> 
  60.  
  61. </executions> 
  62.  
  63. </plugin> 

 

 排除spring的aop

如果對spring aop比較熟悉的都知道,spring的aop也是基于AspectJ的,因此需要exclude的,已經配置到mavn的地方了。

編譯&運行&測試

編譯后class文件已經被織入了相關代碼,如下圖


運行相關日志輸出如下

 說明功能已經實現。

 

責任編輯:姜華 來源: 今日頭條
相關推薦

2024-05-28 07:55:31

SpringBean用域

2021-05-06 07:58:57

Spring BeanIOCAOP

2021-03-08 08:40:25

Spring Bean 創建單例對象

2023-11-03 08:19:18

SpringBean容器

2009-06-19 13:28:30

Spring AOPSpring 2.0

2022-06-07 07:58:45

SpringSpring AOP

2009-06-22 10:41:34

Spring.AOP

2023-11-27 08:17:05

SpringJava

2023-10-16 11:12:29

2022-02-17 13:39:09

AOP接口方式

2024-05-29 08:19:03

2022-06-08 08:04:28

Springservicerepository

2023-07-29 22:11:58

Spring容器Component

2009-06-19 11:09:27

Spring AOP

2009-09-29 10:00:40

Spring AOP框

2022-05-27 08:25:55

容器Spring

2022-06-23 10:47:57

Spring容器工具

2021-05-11 07:42:59

BeanSpring屬性

2024-12-24 14:01:10

2023-03-29 08:24:30

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久国产精品免费一区二区三区 | 午夜日韩 | 亚洲免费精品一区 | 成人做爰9片免费看网站 | 欧美一区二区三区视频 | 久久久久国产一区二区三区四区 | 中文字幕在线观看视频网站 | 亚洲午夜网 | 欧美videosex性极品hd | 涩涩99| 亚洲精品久久久久国产 | 毛片一区二区三区 | 亚洲精品视频网站在线观看 | 成人在线免费 | 影视先锋av资源噜噜 | 欧美亚洲国语精品一区二区 | 免费国产视频在线观看 | 在线视频91| 亚洲免费精品一区 | 国产精品美女久久久久久免费 | 亚洲视频一区二区三区 | 久久免费视频2 | 亚洲欧美v | 欧美日本在线观看 | 中文在线观看视频 | 久久99深爱久久99精品 | 国产精品自在线 | 久久久精品高清 | 美国av毛片 | 成人一区二区视频 | 精品久久影院 | 亚洲一区视频在线 | 黄色网址在线免费播放 | 国产伦精品一区二区三区精品视频 | 欧美中文一区 | 亚洲视频手机在线 | 青草青草久热精品视频在线观看 | 99精品国自产在线 | 国产乱码久久久久久一区二区 | 亚洲精品一区二区在线观看 | 亚洲欧美中文字幕在线观看 |