1. 程式人生 > >Spring AOP 和 AspectJ 之間的差別

Spring AOP 和 AspectJ 之間的差別

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

Spring AOP致力於提供一種能夠與Spring IoC緊密整合的面向方面框架的實現,以便於解決在開發企業級專案時面臨的常見問題。明確你在應用橫切關注點(cross-cutting concern)時(例如事物管理、日誌或效能評估),需要處理的是Spring beans還是POJO。

如果正在開發新的應用,則選擇Spring AOP就沒有什麼阻力。但是如果你正在維護一個現有的應用(該應用並沒有使用Spring框架),AspectJ就將是一個自然的選擇了。為了詳細說明這一點,假如你正在使用Spring AOP,當你想將日誌功能作為一個通知(advice)加入到你的應用中,用於追蹤程式流程,那麼該通知(Advice)就只能應用在Spring beans的連線點(Joinpoint)之上。

另一個需要考慮的因素是,你是希望在編譯期間進行織入(weaving),還是編譯後(post-compile)或是運行時(run-time)。Spring只支援執行時織入。如果你有多個團隊分別開發多個使用Spring編寫的模組(導致生成多個jar檔案,例如每個模組一個jar檔案),並且其中一個團隊想要在整個專案中的所有Spring bean(例如,包括已經被其他團隊打包了的jar檔案)上應用日誌通知(在這裡日誌只是用於加入橫切關注點的舉例),那麼通過配置該團隊自己的Spring配置檔案就可以輕鬆做到這一點。之所以可以這樣做,就是因為Spring使用的是執行時織入。

因為Spring基於代理模式(使用CGLIB),它有一個使用限制,即無法在使用final修飾的bean上應用橫切關注點。因為代理需要對Java類進行繼承,一旦使用了關鍵字final,這將是無法做到的。

例如,在Spring bean MyServicesImpl上使用關鍵字final,並配置一個execution(public * *(..))”這樣的切入點,將導致執行時異常(exception),因為Spring不能為MyServicesImpl生成代理。

// Configuration file

<bean id="myServices" class="com.ashutosh.MyServicesImpl" />

//Java file

public final classMyServicesImpl {

  ---

}

在這種情況下,你也許會考慮使用AspectJ,其支援編譯期織入且不需要生成代理。

於此相似,在static和final方法上應用橫切關注點也是無法做到的。因為Spring基於代理模式。如果你在這些方法上配置通知,將導致執行時異常,因為static和final方法是不能被覆蓋的。在這種情況下,你也會考慮使用AspectJ,因為其支援編譯期織入且不需要生成代理。


相關推薦

Spring AOP AspectJ 之間差別

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

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

原文連結: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

使用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註解XML配置兩種實現(Maven構建)

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

面試中關於Spring AOP代理模式的那些事

我們知道,Spring 中 AOP 是一大核心技術,也是面試中經常會被問到的問題,最近我在網上也看到很多面試題,其中和 Spring AOP 相關的就有不少,這篇文章主要來總結下相關的技術點,希望對大家有用。 0. 幾個常見的問題 針對這一塊的東西,一般下面幾個問題面試官問的比較多: Spr

Spring AOPAspectJ註解

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

什麼是 Spring AOP 代理

https://mbd.baidu.com/newspage/data/landingsuper?context=%7B%22nid%22%3A%22news_9403056301388627935%22%7D&n_type=0&p_from=1  這是這篇部落格的來源,我個人覺得

求求你,下次面試別再問我什麼是 Spring AOP 代理了!

作者 | 倪升武 責編 | 胡巍巍 我們知道,Spring 中 AOP 是一大核心技術,也是面試中經常會被問到的問題,最近我在網上也看到很多面試題,其中和 Spring AOP 相關的就有不少,這篇文章主要來總結下相關的技術點,希望對大家有用

spring aop類方法之間呼叫切面不能匹配

參考:https://docs.spring.io/spring/docs/5.1.3.RELEASE/spring-framework-reference/core.html#aop-understanding-aop-proxies public class SimplePojo

AOPAspectJ-掃盲(轉)

需求和問題   以上篇《AOP是什麼》中併發訪問應用為例子:   多個訪問類同時訪問一個共享資料物件時,每個訪問類在訪問這個資料物件時,需要將資料物件上鎖,訪問完成後,再實行解鎖,供其它併發執行緒訪問,這是我們處理併發訪問資源的方式。   為了實現這個需求,先實現傳統的程式

Spring AOPAspectJ的註解方式使用

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

[轉]求求你,下次面試別再問我什麼是 Spring AOP 代理了!

求求你,下次面試別再問我什麼是 Spring AOP 和代理了! 倪升武 CSDN 1周前 作者 | 倪升武 責編 | 胡巍巍 我們知道,Spring 中 AOP 是一大核心技術,也是面試中經常會被問到的問題,最近我在網上也看到很多面

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

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

基於Spring AOPGroovy日誌模板配置的日誌記錄框架的二次實現與使用案例

一、專案地址 說明:本框架是基於koala-project(專案地址:http://git.oschina.net/openkoala/koala)中的koala-businesslog二次開發,因為koala-project已經很久沒有維護,對於一些

比較 Spring AOPAspectJ

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

spring AOP通知

1.  spring的通知 1.1.  AOP的概念 切面(Aspect):一個關注點的模組化,這個關注點可能會橫切多個物件。事務管理是J2EE應用中一個關於橫切關注點的很好的例子。在Spring AOP中,切面可以使用基於模式或者基於註解的方式來實現。 連線點(Joinp

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

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

利用Spring AOPredis的鎖來實現防止表單重複提交

表單重複提交是在web中存在的一個很常見,會帶來很多麻煩的一個問題。尤其是在表單新增的時候,如果重複提交了多條一樣的資料,帶來的麻煩更大。 實現防止表單重複提交的方法有前端限制和後臺限制1、前端限制就是當點選了提交按鈕之後,就給按鈕新增屬性disabled,然後等後臺返回提交

Spring AOP @Autowired 的問題

今天遇到兩個問題。順便做個筆記。以後遇到相同問題可以快速定位。 用的框架是SSH 1、Spring AOP  報錯 org.springframework.aop.framework.AopConfigException: Could not generate CGLIB