1. 程式人生 > >比較 Spring AOP 與 AspectJ

比較 Spring AOP 與 AspectJ

介紹

如今有多個可用的AOP庫,這些元件需要回答一系列的問題:

  • 是否與我現有的應用相容?
  • 我在哪實現AOP?
  • 整合到我的應用是否很快?
  • 效能開銷是多少?

本文中,我們將會著重回答這些問題,並介紹兩款Java最流行的AOP框架:Spring AOP 和 AspectJ。

AOP概念

在我們開始之前,讓我們對術語和核心概念做一個快速,高水平的回顧:

  • Aspect切面:一個分佈在應用程式中多個位置的標準程式碼/功能,通常與實際的業務邏輯(例如事務管理)不同。 每個切面都側重於一個特定的橫切功能。
  • Joinpoint連線點:這是程式執行中的特定點,如方法執行,構呼叫造函式或欄位賦值等。
  • Advice通知:在一個連線點中,切面採取的行動
  • Pointcut切點:一個匹配連線點的正則表示式。 每當任何連線點匹配一個切入點時,就執行與該切入點相關聯的指定通知。
  • Weaving織入:連結切面和目標物件來建立一個通知物件的過程。

Spring AOP and AspectJ

現在,一起來討論Spring AOP and AspectJ,跨越多指標,如能力和目標、織入方式、內部結構、連線點和簡單性。

Capabilities and Goals

簡而言之,Spring AOP和AspectJ有不同的目標。
Spring AOP旨在通過Spring IoC提供一個簡單的AOP實現,以解決編碼人員面臨的最常出現的問題。這並不是完整的AOP解決方案,它只能用於Spring容器管理的beans。

另一方面,AspectJ是最原始的AOP實現技術,提供了玩這個的AOP解決方案。AspectJ更為健壯,相對於Spring AOP也顯得更為複雜。值得注意的是,AspectJ能夠被應用於所有的領域物件。

Weaving

AspectJ and Spring AOP使用了不同的織入方式,這影響了他們在效能和易用性方面的行為。
AspectJ使用了三種不同型別的織入:

  1. 編譯時織入:AspectJ編譯器同時載入我們切面的原始碼和我們的應用程式,並生成一個織入後的類檔案作為輸出。
  2. 編譯後織入:這就是所熟悉的二進位制織入。它被用來編織現有的類檔案和JAR檔案與我們的切面。
  3. 載入時織入:這和之前的二進位制編織完全一樣,所不同的是織入會被延後,直到類載入器將類載入到JVM。

AspectJ使用的是編譯期和類載入時進行織入,Spring AOP利用的是執行時織入。

執行時織入,在使用目標物件的代理執行應用程式時,編譯這些切面(使用JDK動態代理或者CGLIB代理)。

springaop-processspringaop-process

Internal Structure and Application

Spring AOP 是一個基於代理的AOP框架。這意味著,要實現目標物件的切面,將會建立目標物件的代理類。這可以通過下面兩種方式實現:

  • JDK動態代理:Spring AOP的首選方法。 每當目標物件實現一個介面時,就會使用JDK動態代理。
  • CGLIB代理:如果目標物件沒有實現介面,則可以使用CGLIB代理。

關於Spring AOP可以通過官網瞭解更多。
另一方面,AspectJ在執行時不做任何事情,類和切面是直接編譯的。因此,不同於Spring AOP,他不需要任何設計模式。織入切面到程式碼中,它引入了自己的編譯期,稱為AspectJ compiler (ajc)。通過它,我們編譯應用程式,然後通過提供一個小的(<100K)執行時庫執行它。

Joinpoints

在上一小節,我們介紹了Spring AOP基於代理模式。因此,它需要目標類的子類,並相應的應用橫切關注點。但是也伴隨著侷限性,我們不能跨越“final”的類來應用橫切關注點(或切面),因為它們不能被覆蓋,從而導致執行時異常。

同樣地,也不能應用於靜態和final的方法。由於不能覆寫,Spring的切面不能應用於他們。因此,Spring AOP由於這些限制,只支援執行方法的連線點。
然而,AspectJ在執行前將橫切關注點直接織入實際的程式碼中。 與Spring AOP不同,它不需要繼承目標物件,因此也支援其他許多連線點。AspectJ支援如下的連線點:

joinpoint連線點支援

同樣值得注意的是,在Spring AOP中,切面不適用於同一個類中呼叫的方法。這很顯然,當我們在同一個類中呼叫一個方法時,我們並沒有呼叫Spring AOP提供的代理的方法。如果我們需要這個功能,可以在不同的beans中定義一個獨立的方法,或者使用AspectJ。

Simplicity

Spring AOP顯然更加簡單,因為它沒有引入任何額外的編譯期或在編譯期織入。它使用了執行期織入的方式,因此是無縫整合我們通常的構建過程。儘管看起來很簡單,Spring AOP只作用於Spring管理的beans 。

然而,使用AspectJ,我們需要引入AJC編譯器,重新打包所有庫(除非我們切換到編譯後或載入時織入)。這種方式相對於前一種,更加複雜,因為它引入了我們需要與IDE或構建工具整合的AspectJ Java工具(包括編譯器(ajc),偵錯程式(ajdb),文件生成器(ajdoc),程式結構瀏覽器(ajbrowser))。

Performance

考慮到效能問題,編譯時織入比執行時織入快很多。Spring AOP是基於代理的框架,因此應用執行時會有目標類的代理物件生成。另外,每個切面還有一些方法呼叫,這會對效能造成影響。

AspectJ不同於Spring AOP,是在應用執行前織入切面到程式碼中,沒有額外的執行時開銷。

由於以上原因,AspectJ經過測試大概8到35倍快於Spring AOP。benchmarks

對比

這個快速表總結了Spring AOP和AspectJ之間的主要區別:

com對比

選擇合適的框架

如果我們分析本節所有的論點,我們就會開始明白,沒有絕對的一個框架比另一個框架更好。
簡而言之,選擇很大程度上取決我們的需求:

  • 框架:如果應用程式不使用Spring框架,那麼我們別無選擇,只能放棄使用Spring AOP的想法,因為它無法管理任何超出spring容器範圍的東西。 但是,如果我們的應用程式完全是使用Spring框架建立的,那麼我們可以使用Spring AOP,因為它很直接便於學習和應用。
  • 靈活性:鑑於有限的連線點支援,Spring AOP並不是一個完整的AOP解決方案,但它解決了程式設計師面臨的最常見的問題。 如果我們想要深入挖掘並利用AOP達到其最大能力,並希望獲得來自各種可用連線點的支援,那麼AspectJ是最佳選擇。
  • 效能:如果我們使用有限的切面,那麼效能差異很小。 但是,有時候應用程式有數萬個切面的情況。 在這種情況下,我們不希望使用執行時織入,所以最好選擇AspectJ。 已知AspectJ比Spring AOP快8到35倍。
  • 共同優點:這兩個框架是完全相容的。 我們可以隨時利用Spring AOP,並且仍然使用AspectJ來獲得前者不支援的連線點。

總結

在這篇文章中,我們分析了Spring AOP和AspectJ比較關鍵的幾個方面。我們比較了AOP和AOP兩種方法的靈活性,以及它們與我們的應用程式的匹配程度。

相關推薦

比較 Spring AOP AspectJ

介紹 如今有多個可用的AOP庫,這些元件需要回答一系列的問題: 是否與我現有的應用相容? 我在哪實現AOP? 整合到我的應用是否很快? 效能開銷是多少? 本文中,我們將會著重回答這些問題,並介紹兩款Java最流行的AOP框架:Spring AOP 和 AspectJ。 AOP概念

spring中的AOPAspectJ的區別?

根據我看spring官方文件的理解(不出意外是最正確的答案):①選擇spring的AOP還是AspectJ?spring確實有自己的AOP。功能已經基本夠用了,除非你的要在介面上動態代理或者方法攔截精確到getter和setter。這些都是寫奇葩的需求,一般不使用。②在使用

使用 Spring Aop Mysql 的主從複製功能實現讀寫分離

使用 Spring Aop 與 Mysql 的主從複製功能實現讀寫分離。讀寫分離:將應用程式中對資料庫的寫的操作是一個數據庫;對資料庫讀取資料的是另外一個數據庫。而兩個資料庫的資料需要保證一致。 在應用程式中,可以使用 spring aop 對將要執行的業務方法的特徵進行判斷,如:包含 query、find

Spring AOPAspectJ註解

在本篇文章中,我將講解如何將AspectJ註解整合到Spring AOP框架。在這個Spring AOP+ AspectJ 例子中,將把你從前一篇文章的繁瑣配置中解脫出來,讓你輕鬆實現攔截方法。 常見AspectJ的註解: @Before – 方法執行前執行。 @Aft

Spring Boot 中使用 Spring AOPAspectJ 來測量方法的執行時間

原文連結:https://dzone.com/articles/logging-average-method-execution-times-via-aspectj 作者:Murat Derman 譯者:Darren Luo 想要了解更多有關測量方法執行時間的資訊?檢視本教

Spring-AOPAspectJ的區別和聯絡

AOP是Spring框架的重要組成部分。目前我所接觸的AOP實現框架有Spring AOP還有就是AspectJ(還有另外幾種我沒有接觸過)。我們先來說說他們的區別: AspectJ是一個比較牛逼的AOP框架,他可以對類的成員變數,方法進行攔截。由於 AspectJ

Spring AOPAspectJ的註解方式使用

需要匯入的jar包,請看上一篇部落格。 註解: 如果使用註解進行aop開發,必須進行aspectj自動代理 <aop:aspectj-autoproxy> 通知註解 @Before 前置 @AfterReturning 後置

[AOP] 2. AOP的兩種實現-Spring AOP以及AspectJ

在接觸Spring以及種類繁多的Java框架時,很多開發人員(至少包括我)都會覺得註解是個很奇妙的存在,為什麼加上了@Transactional之後,方法會在一個事務的上下文中被執行呢?為什麼加上了@Cacheable之後,方法的返回值會被記錄到快取中,從而讓下

使用AspectJ需要匯入Spring AOPAspectj相關jar包,新版本Spring框架,建議使用AspectJ方式開發AOP

Spring JDBC是Spring提供的持久層技術簡化JDBC API開發,使用上和Apache公司的DBUtils框架非常類似匯入必要jar包到工程目錄匯入Spring核心開發包到建立工程spring-beans-3.2.0.RELEASE.jarspring-conte

Spring AOPAspectJ 之間的差別

面向方面的程式設計(AOP) 是一種程式設計正規化,旨在通過允許橫切關注點的分離,提高模組化。AOP提供方面來將跨越物件關注點模組化。雖然現在可以獲得許多AOP框架,但在這裡我們要區分的只有兩個流行的框架:Spring AOP和AspectJ。這裡將會幫助你基於一些關鍵資訊

Spring-AOP切面+Aspectj框架的使用

使用Aspectj框架進行AOP切面開發。 首先需要匯入兩個Jar包: 1. aspectjrt.jar 2. aspectjweaver-XXX.jar Aspectj支援的五種註解: @Before: 前置通知, 在方法執行之前執行 @Aft

Spring AOPAspectJ註解和XML配置兩種實現(Maven構建)

xml配置 1.介面和實現類 public interface UserManager { public String findUserById(int userId); } @Service public class UserManage

Spring AOP使用Aspectj基於xml方式,初始化Bean引數

場景: 大多數實體繼承了一個BaseBean,這裡所做的就是使用Spring的Aop功能實現,攔截到的方法,對其引數做一些處理。 spring-xxx.xml的核心配置: <aop:aspectj-autoproxy proxy-ta

Spring AOP 基於AspectJ

簡介 AspectJ是一個基於Java語言的AOP框架,Spring2.0以後新增了對AspectJ切點表示式支援。因為Spring1.0的時候Aspectj還未出現; AspectJ1.5中新增了對註解的支援,允許直接在Bean類中定義切面。新版本的Spring框架建 議我們都使用AspectJ方式來開發A

曹工說Spring Boot原始碼(22)-- 你說我Spring Aop依賴AspectJ,我依賴它什麼了

# 寫在前面的話 相關背景及資源: [曹工說Spring Boot原始碼(1)-- Bean Definition到底是什麼,附spring思維導圖分享](https://www.cnblogs.com/grey-wolf/p/12044199.html) [曹工說Spring Boot原始碼(2)--

JAVA的動態代理模式分析以及spring AOP比較

本文是結合《輕量級Java EE企業應用實戰(李剛)》這本書以及個人的一點理解寫的,記錄下來以作學習之用。 1.代理就是一個java物件代表另一個java物件來採取行動。為什麼需要採用代理呢?很簡單,就是在某些情況下,客戶端程式碼不想或者是不能直接呼叫被呼叫者,這時候代理物

Spring全家桶(八)AOP核心思想AspectJ 5種類型通知

一、AOP核心思想 AOP是Aspect-Oriented Programming的縮寫,翻譯為面向切面程式設計。我個人理解切面就是一個方面。 例子,一個接口裡面有增刪改查四個方法: package com.stuspring.aop.impl; /

使用aspectJ實現Spring AOP的兩種方式

classpath .org 導入 ntc www. 之前 oid 方式 public 方式一:基於aspectJ的XML配置 方式二:基於aspectJ的註解方式 基於aspectJ的XML配置 1) 引入相關jar包 2) 創建Spr

Spring AOP高級——源碼實現(2)Spring AOP中通知器(Advisor)切面(Aspect)

color oaf 小麻煩 ntc tro sta ins pack package 本文例子完整源碼地址:https://github.com/yu-linfeng/BlogRepositories/tree/master/repositories/Spring%20AO

spring-AOP原理應用

圖片 spa 應用 framework round 子類 cee 過程 訪問 什麽是AOPSpring是解決實際開發中的一些問題:* AOP解決OOP中遇到的一些問題.是OOP的延續和擴展.AOP作用 對程序進行增強:不修改源碼的情況下. * AOP可以進行權限