面試官:什么是AOP?Spring AOP和AspectJ的區別是什么?


AOP(Aspect Orient Programming),它是面向對象編程的一種補充,主要應用於處理一些具有橫切性質的系統級服務,如日志收集、事務管理、安全檢查、緩存、對象池管理等。

AOP實現的關鍵就在於AOP框架自動創建的AOP代理,AOP代理則可分為靜態代理和動態代理兩大類,其中靜態代理是指使用AOP框架提供的命令進行編譯,從而在編譯階段就可生成 AOP 代理類,因此也稱為編譯時增強;而動態代理則在運行時借助於JDK動態代理、CGLIB等在內存中“臨時”生成AOP動態代理類,因此也被稱為運行時增強。

面向切面的編程(AOP) 是一種編程范式,旨在通過允許橫切關注點的分離,提高模塊化。AOP提供切面來將跨越對象關注點模塊化。

AOP要實現的是在我們寫的代碼的基礎上進行一定的包裝,如在方法執行前、或執行后、或是在執行中出現異常后這些地方進行攔截處理或叫做增強處理

Aop的概念

Pointcut:是一個(組)基於正則表達式的表達式,有點繞,就是說他本身是一個表達式,但是他是基於正則語法的。通常一個pointcut,會選取程序中的某些我們感興趣的執行點,或者說是程序執行點的集合。

JoinPoint:通過pointcut選取出來的集合中的具體的一個執行點,我們就叫JoinPoint.

Advice:在選取出來的JoinPoint上要執行的操作、邏輯。關於5種類型,我不多說,不懂的同學自己補基礎。

Aspect:就是我們關注點的模塊化。這個關注點可能會橫切多個對象和模塊,事務管理是橫切關注點的很好的例子。它是一個抽象的概念,從軟件的角度來說是指在應用程序不同模塊中的某一個領域或方面。又pointcut 和advice組成。

Weaving:把切面應用到目標對象來創建新的 advised 對象的過程。

AspectJ是什么?能做什么?

AspectJ是一個易用的功能強大的AOP框架

AspectJ全稱是Eclipse AspectJ, 其官網地址是: ,目前最新版本為:1.9.0

引用官網描述:

  • a seamless aspect-oriented extension to the Javatm programming language(一種基於Java平台的面向切面編程的語言)
  • Java platform compatible(兼容Java平台,可以無縫擴展)
  • easy to learn and use(易學易用)

可以單獨使用,也可以整合到其它框架中。

單獨使用AspectJ時需要使用專門的編譯器ajc。

java的編譯器是javac,AspectJ的編譯器是ajc,aj是首字母縮寫,c即compiler。

AspectJ和Spring AOP的區別?

相信作為Java開發者我們都很熟悉Spring這個框架,在spring框架中有一個主要的功能就是AOP,提到AOP就往往會想到AspectJ,下面我對AspectJ和Spring AOP作一個簡單的比較:

Spring AOP

1、基於動態代理來實現,默認如果使用接口的,用JDK提供的動態代理實現,如果是方法則使用CGLIB實現

2、Spring AOP需要依賴IOC容器來管理,並且只能作用於Spring容器,使用純Java代碼實現

3、在性能上,由於Spring AOP是基於動態代理來實現的,在容器啟動時需要生成代理實例,在方法調用上也會增加棧的深度,使得Spring AOP的性能不如AspectJ的那么好

AspectJ

  • AspectJ來自於Eclipse基金會
  • AspectJ屬於靜態織入,通過修改代碼來實現,有如下幾個織入的時機:

​ 1、編譯期織入(Compile-time weaving): 如類 A 使用 AspectJ 添加了一個屬性,類 B 引用了它,這個場景就需要編譯期的時候就進行織入,否則沒法編譯類 B。

​ 2、編譯后織入(Post-compile weaving): 也就是已經生成了 .class 文件,或已經打成 jar 包了,這種情況我們需要增強處理的話,就要用到編譯后織入。

​ 3、類加載后織入(Load-time weaving): 指的是在加載類的時候進行織入,要實現這個時期的織入,有幾種常見的方法。1、自定義類加載器來干這個,這個應該是最容易想到的辦法,在被織入類加載到 JVM 前去對它進行加載,這樣就可以在加載的時候定義行為了。2、在 JVM 啟動的時候指定 AspectJ 提供的 agent:-javaagent:xxx/xxx/aspectjweaver.jar

  • AspectJ可以做Spring AOP干不了的事情,它是AOP編程的完全解決方案,Spring AOP則致力於解決企業級開發中最普遍的AOP(方法織入)。而不是成為像AspectJ一樣的AOP方案
  • 因為AspectJ在實際運行之前就完成了織入,所以說它生成的類是沒有額外運行時開銷的

對比總結

下表總結了 Spring AOP 和 AspectJ 之間的關鍵區別:

 

轉載原路徑:https://zhuanlan.zhihu.com/p/113256693

本次轉載只為學習,如有侵犯請通知刪除!!!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM