日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

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

新聞中心

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

 前幾天有個(gè)朋友問(wèn)了一個(gè)問(wèn)題,覺(jué)得可以給大家分享一下。

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

問(wèn)題如下圖

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

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

  • java動(dòng)態(tài)代理為什么需要基于接口
  • cglib動(dòng)態(tài)代理對(duì)類(lèi)沒(méi)有任何限制嗎?

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

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

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

Java Agent

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

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

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

AspectJ方案

可以利用aspectj + javac來(lái)編譯織入代碼,也可以利用maven插件aspectj-maven-plugin,下面利用AspectJ注解 + aspectj-maven-plugin來(lái)實(shí)戰(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

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

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

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

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

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


當(dāng)前標(biāo)題:非Spring管理Bean如何添加AOP呢?
分享網(wǎng)址:http://m.5511xx.com/article/djgjgoj.html