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

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

AOP實現的關鍵就在於AOP框架自動建立的AOP代理,AOP代理則可分爲靜態代理和動態代理兩大類,其中靜態代理是指使用AOP框架提供的命令進行編譯,從而在編譯階段就可生成 AOP 代理類,所以也稱爲編譯時加強;而動態代理則在運行時藉助於JDK動態代理、CGLIB等在內存中「臨時」生成AOP動態代理類,所以也被稱爲運行時加強。程序員

面向切面的編程(AOP) 是一種編程範式,旨在經過容許橫切關注點的分離,提升模塊化。AOP提供切面來將跨越對象關注點模塊化。正則表達式

AOP要實現的是在咱們寫的代碼的基礎上進行必定的包裝,如在方法執行前、或執行後、或是在執行中出現異常後這些地方進行攔截處理或叫作加強處理spring

Aop的概念

Pointcut:是一個(組)基於正則表達式的表達式,有點繞,就是說他自己是一個表達式,可是他是基於正則語法的。一般一個pointcut,會選取程序中的某些咱們感興趣的執行點,或者說是程序執行點的集合。編程

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

Advice:在選取出來的JoinPoint上要執行的操做、邏輯。關於5種類型,我很少說,不懂的同窗本身補基礎。安全

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

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

AspectJ是什麼?能作什麼?

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

AspectJ全稱是Eclipse AspectJ, 其官網地址是:http://www.eclipse.org/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

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

二、Spring AOP須要依賴IOC容器來管理,而且只能做用於Spring容器,使用純Java代碼實現

三、在性能上,因爲Spring AOP是基於動態代理來實現的,在容器啓動時須要生成代理實例,在方法調用上也會增長棧的深度,使得Spring AOP的性能不如AspectJ的那麼好

AspectJ

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

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

​ 二、編譯後織入(Post-compile weaving): 也就是已經生成了 .class 文件,或已經打成 jar 包了,這種狀況咱們須要加強處理的話,就要用到編譯後織入。

​ 三、類加載後織入(Load-time weaving): 指的是在加載類的時候進行織入,要實現這個時期的織入,有幾種常見的方法。一、自定義類加載器來幹這個,這個應該是最容易想到的辦法,在被織入類加載到 JVM 前去對它進行加載,這樣就能夠在加載的時候定義行爲了。二、在 JVM 啓動的時候指定 AspectJ 提供的 agent:-javaagent:xxx/xxx/aspectjweaver.jar

  • AspectJ能夠作Spring AOP幹不了的事情,它是AOP編程的徹底解決方案,Spring AOP則致力於解決企業級開發中最廣泛的AOP(方法織入)。而不是成爲像AspectJ同樣的AOP方案
  • 由於AspectJ在實際運行以前就完成了織入,因此說它生成的類是沒有額外運行時開銷的

對比總結

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

Spring AOP AspectJ
在純 Java 中實現 使用 Java 編程語言的擴展實現
不須要單獨的編譯過程 除非設置 LTW,不然須要 AspectJ 編譯器 (ajc)
只能使用運行時織入 運行時織入不可用。支持編譯時、編譯後和加載時織入
功能不強-僅支持方法級編織 更強大 - 能夠編織字段、方法、構造函數、靜態初始值設定項、最終類/方法等......。
只能在由 Spring 容器管理的 bean 上實現 能夠在全部域對象上實現
僅支持方法執行切入點 支持全部切入點
代理是由目標對象建立的, 而且切面應用在這些代理上 在執行應用程序以前 (在運行時) 前, 各方面直接在代碼中進行織入
比 AspectJ 慢多了 更好的性能
易於學習和應用 相對於 Spring AOP 來講更復雜

若是文章的內容對你有幫助,歡迎關注公衆號:優享JAVA(ID:YouXiangJAVA),那裏有更多的技術乾貨,並精心準備了一份程序員書單。期待你的到來!

相關文章
相關標籤/搜索