java語言里aop的實現種類(java中aop概念)

本文目錄一覽:

aspectj框架的aop開發方式有哪幾種

使用aspectj實現aop有兩種方式:

(1)基於aspectj的xml配置;

(2)基於aspectj的註解方式;

基於aspectj的xml配置:

(1)導入相關的AOP的jar包

(2)創建Spring核心配置文件,導入aop的約束

(3)使用表達式配置切入點

常用的表達式:

execution(訪問修飾符?返回類型方法名(參數)異常)

(4)代碼測試

基於aspectj的註解方式:

(1)導入與AOP相關的jar包

(2)創建對象:

(3)開啟Aop操作:

(4)在增強類使用註解@Aspect,在方法上使用註解完結增強配置。

(5)測試代碼

介紹幾個JAVA的AOP框架開源項目

基於Java的簡單、動態、輕量級、強大的AOP框架。既強大又簡單,有助於更容易的集成AOP到新的或已存在的項目中。

AspectWerkz 主要特性: 

1. 運行時和加載時字節碼修正:你可以在運行時或編譯時輕鬆的改造任何(舊)應用程序或除了rt.jar以外的外部類庫

2. 支持join point模型

3. 支持Annotation:匹配JavaDoc和JSR-175,支持用戶自定義Annotation

4. 支持部署多個Aspect定義文件到部署的應用程序(WEB-INF/aop.xml、META-INF/aop.xml)

5. Introduction/內類型聲明(也稱Mixin),也就是具有添加接口和實現到已存在的類中的能力

6. Annotation定義:定義Aspect使用的運行時Annotation(為JSR-175準備)

7. XML定義:定義Aspect使用的XML;XML可以用來精鍊、改寫和解析Annotation定義

8. 插件式Aspect管理器能夠和IoC框架(如Spring或PicoContainer)一起工作

9. 四種不同的Advice和Introduction部署模型(範圍):perJVM(單模式)、 perClass、perInstance 和perThread 

10. Advice和Introduction能夠動態部署、反部署或重新部署

11. 高性能,使用JIT編譯

12. 使用Fine-grained模式語言選擇join point

13. 所有Advice能夠和所有的join point和各種混合類型的pointcut

14. 脫機變換(可以用作後處理器)

15. Aspect、Advice和Introduction使用POJO編碼 

16. 目標類可以是正規的POJO,也就是不需要接口

17. 支持通過定義傳遞參數給Advice和定義可重用的Advice堆棧

18. 元數據被加到類中

19. 簡單的用法和配置

AspectWerkz在Eclipse下的輔助開發插件→

更多AspectWerkz信息

JBoss AOP

JBoss 4.0帶了一個AOP框架。這個框架和JBoss應用服務器緊密地結合,但是你也能夠在你的應用中,單獨的運行它。

更多JBoss AOP信息

Nanning

一個雖然簡單但也是一個java開源的AOP框架。名字以中文的拼音拼寫就是廣西的南寧。

更多Nanning信息

JAC

JAC (Java Aspect Components)是一個應用服務器。它為Java2平台、用於Java開發的企業開發環境(J2EE)、和基於Web的分布式應用,提供開放式資源的又一個選擇(在GNU次常規公共許可證下發布)。JAC包括統一模型語言(UML)IDE,該UML IDE模塊化應用商業邏輯並且自動生成和編譯純商業邏輯Java類。這些類,在JAC容器內執行,可從一組技術和/或商業的橫切關係(crosscutting concerns)[1] 如數據持久性、認證、配置文件管理、訪問權限檢測、演示、和負載平衡中無縫地受益。基於面向方面編程技術(AOP)的JAC將這些關係( concerns)[2]從應用程序的核心商業邏輯中分離出來。

更多JAC信息

DynamicAspects

DynamicAspects能夠讓你使用java編寫的面向切面的程序設計,它使用在Sun JDK 1.5中介紹的”instrumentation”與”agent”,Aspects能夠軟件各模塊之間的關係在運行期安裝與使用。

更多DynamicAspects信息

dynaop

dynaop框架使用一個基於運行時的編程機制將AOP代碼插入對象中,而不是返回一個具有特徵代碼的對象。AOP將是面向對象設計(OO)的一個新的領域。

更多dynaop信息

CAESAR

CAESAR是一個新的與Java兼容的AOP語言。所有java程序多能使用CAESAR。

更多CAESAR信息

PROSE

PROSE是一個動態編排(weaving)工具(允許在運行期插入或抽取aspects)。PROSE aspects是規則的Java對象能夠被發送到或從網絡上的計算機接收。簽名可被用於保證它們的完整性。一旦一個aspect插入到JVM中,任何事件的發生將影響在相應aspect advice執行的結果。假如一個aspect從JVM中撤消,aspect代碼將被丟棄並且相應的攔截也將不會再發生。PROSE aspects是規則的Java對象能夠被發送到或從網絡上的計算機接收。簽名可被用於保證它們的完整性。一旦一個aspect插入到JVM中,任何事件的發生將影響在相應aspect advice執行的結果。假如一個aspect從JVM中撤消,aspect代碼將被丟棄並且相應的攔截也將不會再發生。下圖是PROSE的體系結構圖:

更多PROSE信息

FastAOP

FastAOP是一個高性能AOP框架。最初開發該框架是為了支持對大型J2EE應用程序進行性能剖析和監測。它幾乎不佔用運行時間。FastAOP已經在Websphere和Jboss應用服務器上得到成功測試。

更多FastAOP信息

Plastic

Plastic是一個構建在ASM 3.3之上的AOP工具包。支持類的基本加載和實例化。引進新的屬性。不需要使用反射就能夠訪問私有屬性和方法。重寫屬性訪問權限。注入屬性。Method advice(在調用現在方法之後/之前執行一些邏輯)。DIV class=date收錄時間:2011-05-25 15:25:03/DIV

更多Plastic信息

Java實現AOP的幾種方式

(1)AOP的各種實現

在編譯器修改源代碼、在運行期字節碼加載前修改字節碼或字節碼加載後動態創建代理類的字節碼。以下是各種實現機制的比較:

類別分為靜態AOP(包括靜態織入)和動態AOP(包括動態代理、動態字節碼生成、自定義類加載器、字節碼轉換)。

靜態織入:

a、原理:在編譯期,切面直接以字節碼形式編譯到目標字節碼文件中 ;

b、優點:對系統性能無影響;

c、缺點:不夠靈活;

動態代理 :

a、原理:在運行期,目標類加載後,為接口動態生成代理類。將切面織入到代理類中;

b、優點:更靈活;

c、缺點:切入的關注點要實現接口;

Java編程中的AOP和IOC分別是什麼呢,什麼時候用呢

控制反轉(IOC)

(理解好Ioc的關鍵是要明確“誰控制誰,控制什麼,為何是反轉(有反轉就應該有正轉了),哪些方面反轉了”)

1、Ioc—Inversion of Control:即“控制反轉”,不是什麼技術,而是一種設計思想。在Java開發中,Ioc意味着將你設計好的對象交給容器控制,而不是傳統的在你的對象內部直接控制。

2、誰控制誰,控制什麼:傳統Java SE程序設計,我們直接在對象內部通過new進行創建對象,是程序主動去創建依賴對象;而IoC是有專門一個容器來創建這些對象即由Ioc容器來控制對象的創建。

   誰控制誰?當然是IoC 容器控制了對象。

   控制什麼?那就是主要控制了外部資源獲取(不只是對象包括比如文件等)。

3、為何是反轉,哪些方面反轉了: 有反轉就有正轉,傳統應用程序是由我們自己在對象中主動控制去直接獲取依賴對象,也就是正轉;而反轉則是由容器來幫忙創建及注入依賴對象。

  為何是反轉?因為由容器幫我們查找及注入依賴對象,對象只是被動的接受依賴對象,所以是反轉。

哪些方面反轉了?依賴對象的獲取被反轉了。     

      還是不明白沒事,下面搞個簡單案例來說就懂啦 !!!

      例子:當我們在任何一個有實際開發意義的程序項目中,我們會使用很多類來描述他們特有的功能,並且通過類與類之間的相互協作來完成特定的業務邏輯。這個時候,每個類都需要負責管理與自己有交互的類的引用和依賴,代碼將會變的異常難以維護和極高的高耦合。而IOC的出現正是用來解決這個問題,我們通過IOC將這些依賴對象的創建、協調工作交給spring容器去處理,每個對象值需要關注其自身的業務邏輯關係就可以了。在這樣的角度上來看,獲得依賴的對象的方式,進行了反轉,變成了由spring容器控制對象如何獲取外部資源(包括其他對象和文件資料等)。

總的來說:IOC就是通過在Xml配置文件里依賴注入來解決代碼問題。

IOC的注入類型有幾種?主要可以劃分為三種:構造函數注入、屬性注入和接口注入。Spring支持構造函數注入和屬性注入

       

面向切面(AOP)

(面向切面編程,AOP其實只是OOP的補充而已,AOP基本上是通過代理機制實現的。)

        我們管切入到指定類指定方法的代碼片段稱為切面,而切入到哪些類、哪些方法則叫切入點。有了AOP,我們就可以把幾個類共有的代碼,抽取到一個切片中,等到需要時再切入對象中去,從而改變其原有的行為。   

         我們都知道 Java 是 OOP-面向對象編程的,它有自己的優勢,也有自己的不足。比如說:在我們開發中,都會有一條業務主線(即客戶的需求)。而我們要做的就是實現這個主線上的需求。我們在實現這些功能的時候,經常要干一些額外的不可避免的事情,比如事務的管理,日誌的記錄等,就很繁雜且代碼量增多,所以 Spring 提供了另一種角度來思考程序結構,也就是把這一些事情剝離出來,然後適時適地的把它們加入到我們的代碼中,比如說 聲明式事務管理的時候,我們在 service 層檢測到save*、update*這些方法要被調用的時候,我們先進行開啟事務什麼的,這就是AOP,面向編程的思想。

      AOP的術語:

         1、通知(Advice):就是你想要的功能,也就是上面說的 安全,事物,日誌等。你給先定義好把,然後在想用的地方用一下

         2、連接點(JoinPoint):這個更好解釋了,就是spring允許你使用通知的地方,那可真就多了,基本每個方法的前,後(兩者都有也行),或拋出異常時都可以是連接點,spring只支持方法連接點.其他如aspectJ還可以讓你在構造器或屬性注入時都行,不過那不是咱關注的,只要記住,和方法有關的前前後後(拋出異常),都是連接點。

         3、切入點(Pointcut):上面說的連接點的基礎上,來定義切入點,你的一個類里,有15個方法,那就有幾十個連接點了對把,但是你並不想在所有方法附近都使用通知(使用叫織入,以後再說),你只想讓其中的幾個,在調用這幾個方法之前,之後或者拋出異常時干點什麼,那麼就用切點來定義這幾個方法,讓切點來篩選連接點,選中那幾個你想要的方法。

         4、切面(Aspect):切面是通知和切入點的結合。現在發現了吧,沒連接點什麼事情,連接點就是為了讓你好理解切點,搞出來的,明白這個概念就行了。通知說明了幹什麼和什麼時候干(什麼時候通過方法名中的before,after,around等就能知道),而切入點說明了在哪干(指定到底是哪個方法),這就是一個完整的切面定義。

         5、引入(introduction):允許我們向現有的類添加新方法屬性。這不就是把切面(也就是新方法屬性:通知定義的)用到目標類中嗎

         6、目標(target):引入中所提到的目標類,也就是要被通知的對象,也就是真正的業務邏輯,他可以在毫不知情的情況下,被咱們織入切面。而自己專註於業務本身的邏輯。

         7、代理(proxy):怎麼實現整套aop機制的,都是通過代理,這個一會給細說。

         8、織入(weaving):把切面應用到目標對象來創建新的代理對象的過程。有3種方式,spring採用的是運行時,為什麼是運行時,後面解釋。

北大青鳥java培訓:動態SpringAOP的是如何實現的?

SpringAOP是利用代理模式,在運行時生成一個目標對象的代理,並且使用代理代替目標對象,整個過程對使用者透明,使用者無法像使用目標對象一樣使用代理對象,代理對象類型是目標對象所屬類的子類或者接口實現,廣西IT培訓認為這個子類也是在運行時動態生成,這個生成子類的過程使用操作字節碼技術,Spring框架中使用兩種字節碼技術:JDK動態代理和CGLIB,當目標類實現了接口時使用JDK動態代理,否則使用CGLIB代理。

AOP的實現包含下面幾個步驟:根據配置或註解解析切面。

生成AOP代理對象,給目標對象生成一個代理類以及代理類實例,根據解析出的切面,生成通知鏈設置到代理對象,在代理的回調中會執行通知鏈。

把AOP代理對象註冊到容器中代替目標對象,當使用者向容器請求目標bean時,容器會返回代理對象。

 下面對這幾個步驟逐一的分析。

切面解析在分析切面解析過程之前,首先先了解一下幾個關鍵的接口,看下面的類圖。

PointCut:描述切點,在進行切點匹配時,使用ClassFilter進行類匹配,MethodMatcher進行執行方法匹配。

Advice:通知,AfterAdvice後通知,BeforeAdvice前通知,DynamicIntroductionAdvice引用通知,環繞通知通過Interceptor實現。

Advisor:通知器,也就是切面,PointcutAdvisor切點通知器,IntroductionAdvisor引用通知器。

 在創建AOP代理之前需要把相關的切面配置解析成上面類圖中的接口子類的對象,對於ProxyFactoryBean來說,沒有這個過程,因為這種方式下不能使用切點。

切面解析完成之後,把解析出的通知添加通知鏈中,AOP代理對象引用該通知鏈執行切面通知邏輯。

對於aop標籤方式和註解方式添加通知鏈這個動作的代碼是類似的,解析切面這個過程有些差異。

原創文章,作者:簡單一點,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/129972.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
簡單一點的頭像簡單一點
上一篇 2024-10-03 23:27
下一篇 2024-10-03 23:27

相關推薦

  • java client.getacsresponse 編譯報錯解決方法

    java client.getacsresponse 編譯報錯是Java編程過程中常見的錯誤,常見的原因是代碼的語法錯誤、類庫依賴問題和編譯環境的配置問題。下面將從多個方面進行分析…

    編程 2025-04-29
  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • Java騰訊雲音視頻對接

    本文旨在從多個方面詳細闡述Java騰訊雲音視頻對接,提供完整的代碼示例。 一、騰訊雲音視頻介紹 騰訊雲音視頻服務(Cloud Tencent Real-Time Communica…

    編程 2025-04-29
  • Java Bean加載過程

    Java Bean加載過程涉及到類加載器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean加載的過程。 一、類加載器 類加載器是Java虛擬機…

    編程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介紹

    本文將詳細介紹Java Milvus SearchParam withoutFields的相關知識和用法。 一、什麼是Java Milvus SearchParam without…

    編程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java語言中的一個版本,於2014年3月18日發布。本文將從多個方面對Java 8中某一周的周一進行詳細的闡述。 一、數組處理 Java 8新特性之一是Stream…

    編程 2025-04-29
  • Java判斷字符串是否存在多個

    本文將從以下幾個方面詳細闡述如何使用Java判斷一個字符串中是否存在多個指定字符: 一、字符串遍歷 字符串是Java編程中非常重要的一種數據類型。要判斷字符串中是否存在多個指定字符…

    編程 2025-04-29
  • AES加密解密算法的C語言實現

    AES(Advanced Encryption Standard)是一種對稱加密算法,可用於對數據進行加密和解密。在本篇文章中,我們將介紹C語言中如何實現AES算法,並對實現過程進…

    編程 2025-04-29
  • 學習Python對學習C語言有幫助嗎?

    Python和C語言是兩種非常受歡迎的編程語言,在程序開發中都扮演着非常重要的角色。那麼,學習Python對學習C語言有幫助嗎?答案是肯定的。在本文中,我們將從多個角度探討Pyth…

    編程 2025-04-29
  • VSCode為什麼無法運行Java

    解答:VSCode無法運行Java是因為默認情況下,VSCode並沒有集成Java運行環境,需要手動添加Java運行環境或安裝相關插件才能實現Java代碼的編寫、調試和運行。 一、…

    編程 2025-04-29

發表回復

登錄後才能評論