日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
非Spring管理Bean如何添加AOP呢?

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

創(chuàng)新互聯(lián)建站10多年企業(yè)網(wǎng)站建設(shè)服務(wù);為您提供網(wǎng)站建設(shè),網(wǎng)站制作,網(wǎng)頁設(shè)計及高端網(wǎng)站定制服務(wù),企業(yè)網(wǎng)站建設(shè)及推廣,對食品包裝袋等多個領(lǐng)域擁有豐富設(shè)計經(jīng)驗的網(wǎng)站建設(shè)公司。

問題如下圖

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

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

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

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

答案當(dāng)然是有。

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

Java Agent

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

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

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

AspectJ方案

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

aspectj-maven-plugin官網(wǎng) http://www.mojohaus.org/aspectj-maven-plugin/usage.html

引入依賴

編譯增強(qiáng),依賴此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.  
  2.  
  3. org.codehaus.mojo 
  4.  
  5. aspectj-maven-plugin 
  6.  
  7. 1.11 
  8.  
  9.  
  10.  
  11. 1.8 
  12.  
  13. 1.8 
  14.  
  15.  
  16.  
  17.  
  18.  
  19. UTF-8 
  20.  
  21.  
  22.  
  23.  
  24.  
  25. src/main/java 
  26.  
  27.  
  28.  
  29.  
  30.  
  31.  
  32.  
  33.  
  34.  
  35.  
  36.  
  37.  
  38.  
  39. **/ServiceAop.java 
  40.  
  41.  
  42.  
  43.  
  44.  
  45.  
  46.  
  47.  
  48.  
  49.  
  50.  
  51.  
  52.  
  53.  
  54.  
  55. compile 
  56.  
  57.  
  58.  
  59.  
  60.  
  61.  
  62.  
  63.  

配置maven插件

 
 
 
 
  1.  
  2.  
  3. org.codehaus.mojo 
  4.  
  5. aspectj-maven-plugin 
  6.  
  7. 1.11 
  8.  
  9.  
  10.  
  11. 1.8 
  12.  
  13. 1.8 
  14.  
  15.  
  16.  
  17.  
  18.  
  19. UTF-8 
  20.  
  21.  
  22.  
  23.  
  24.  
  25. src/main/java 
  26.  
  27.  
  28.  
  29.  
  30.  
  31.  
  32.  
  33.  
  34.  
  35.  
  36.  
  37.  
  38.  
  39. **/ServiceAop.java 
  40.  
  41.  
  42.  
  43.  
  44.  
  45.  
  46.  
  47.  
  48.  
  49.  
  50.  
  51.  
  52.  
  53.  
  54.  
  55. compile 
  56.  
  57.  
  58.  
  59.  
  60.  
  61.  
  62.  
  63.  

排除spring的aop

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

編譯&運(yùn)行&測試

編譯后class文件已經(jīng)被織入了相關(guān)代碼,如下圖

運(yùn)行相關(guān)日志輸出如下

 說明功能已經(jīng)實現(xiàn)。


本文標(biāo)題:非Spring管理Bean如何添加AOP呢?
本文URL:http://www.dlmjj.cn/article/djgjgoj.html