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, 其官網地址是: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
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
本次轉載只為學習,如有侵犯請通知刪除!!!