摘要:擴展了語言,定義了語法,所以它有一個專門的編譯器用來生成遵守字節(jié)碼規(guī)范的文件注意此,非。只是提供了和語法一致的語義注解,兩者是完全不同的實現(xiàn)。修改類運行時,在內(nèi)通過轉(zhuǎn)換類的字節(jié)碼,把橫切邏輯織入到目標(biāo)類中。
AOP概述
AOP(Aspect-Oriented Programming,面向切面的編程)是一種編程范式,專注于解耦業(yè)務(wù)邏輯和橫切邏輯,從而達到提升內(nèi)聚和模塊化的目的。
業(yè)務(wù)邏輯 :處理業(yè)務(wù)的邏輯。
橫切邏輯 :通常固定的出現(xiàn)在業(yè)務(wù)邏輯的邊界處,在進入業(yè)務(wù)邏輯前或執(zhí)行業(yè)務(wù)邏輯后做一些事情。
看一個例子:
橫切邏輯
public class PerformanceMonitor { public void start() { System.out.println("開始時間: " + String.valueOf(System.currentTimeMillis())); } public void end() { System.out.println("結(jié)束時間: " + String.valueOf(System.currentTimeMillis())); } }
業(yè)務(wù)邏輯
public class Biz { private PerformanceMonitor pMonitor = new PerformanceMonitor(); public void doSomething() { pMonitor.start(); System.out.println("做一些業(yè)務(wù)邏輯"); pMonitor.end(); } public static void main(String [] args) { Biz biz = new Biz(); biz.doSomething(); } }
上面例子中,我們希望通過PerformanceMonitor打印業(yè)務(wù)執(zhí)行開始和結(jié)束時間,乍眼一看似乎沒毛病。
那問題來了,如果我希望:
在調(diào)試階段才打印開始和結(jié)束時間,應(yīng)用發(fā)布后不打印。
希望在其他業(yè)務(wù)邏輯開始和結(jié)束的時候也打印時間。
按照現(xiàn)在的處理方式,業(yè)務(wù)邏輯和橫切邏輯耦合在了一起,需要滿足上述需求的話,需要修改代碼后再重新編譯,顯然這種處理方式不夠優(yōu)美。
AOP就是一種優(yōu)美的處理方式,如下:
Java AOP的實現(xiàn)方式Java中實現(xiàn)AOP的方式分 靜態(tài)AOP 和 動態(tài)AOP 兩大類,下面分別列舉。
靜態(tài)AOP在編譯期間,橫切邏輯直接以字節(jié)碼形式編譯到業(yè)務(wù)邏輯的字節(jié)碼文件中,通常需要特殊的編譯器。
Aspectj擴展了java語言,定義了AOP語法,所以它有一個專門的編譯器(ajc)用來生成遵守Java字節(jié)碼規(guī)范的Class文件
注意 : 此Aspectj,非Spring Aspectj。Spring Aspectj只是提供了和Aspectj AOP語法一致的語義注解,兩者是完全不同的實現(xiàn)。
動態(tài)AOP在運行期間,通過修改目標(biāo)類的字節(jié)碼、生成類的子類或代理類織入橫切邏輯。
運行時,通過為目標(biāo)類實現(xiàn)的接口動態(tài)生成代理類,把橫切邏輯織入到代理類中。
運行時,通過為目標(biāo)類生成子類,把橫切邏輯織入到子類中。
運行時,在類加載器加載類的時候,修改目標(biāo)類的字節(jié)碼,把橫切邏輯織入到目標(biāo)類中。
AOP方式比較運行時,在Java Agent內(nèi)通過Instrumentation轉(zhuǎn)換類的字節(jié)碼,把橫切邏輯織入到目標(biāo)類中。
AOP方式 | 效率 | 實現(xiàn)接口 | final method | 其他特點 | |
---|---|---|---|---|---|
Aspectj | 編譯效率低,運行效率高 | 不需要 | 支持 | - | |
JDK動態(tài)代理 | 生成代理效率高,執(zhí)行效率低 | 需要 | N/A | 通過反射方式調(diào)業(yè)務(wù)邏輯 | |
生成子類 | 生成子類效率低,執(zhí)行效率高 | 不需要 | 不支持 | - | |
自定義 ClassLoader | 加載效率低,執(zhí)行效率高 | 不需要 | 支持 | 只能對自動義類加載器加載的類織入 | |
ClassFileTransformer | 加載效率低,執(zhí)行效率高 | 不需要 | 支持 | 對所有類織入 |
PS :未完待續(xù),后續(xù)章節(jié)針對每一種AOP方式舉例,實現(xiàn)PerformanceMonitor橫切邏輯的織入。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/67436.html
摘要:是一種特殊的增強切面切面由切點和增強通知組成,它既包括了橫切邏輯的定義也包括了連接點的定義。實際上,一個的實現(xiàn)被拆分到多個類中在中聲明切面我們知道注解很方便,但是,要想使用注解的方式使用就必須要有源碼因為我們要 前言 只有光頭才能變強 上一篇已經(jīng)講解了Spring IOC知識點一網(wǎng)打盡!,這篇主要是講解Spring的AOP模塊~ 之前我已經(jīng)寫過一篇關(guān)于AOP的文章了,那篇把比較重要的知...
摘要:,,面向切面編程。,切點,切面匹配連接點的點,一般與切點表達式相關(guān),就是切面如何切點。例子中,注解就是切點表達式,匹配對應(yīng)的連接點,通知,指在切面的某個特定的連接點上執(zhí)行的動作。,織入,將作用在的過程。因為源碼都是英文寫的。 之前《零基礎(chǔ)帶你看Spring源碼——IOC控制反轉(zhuǎn)》詳細(xì)講了Spring容器的初始化和加載的原理,后面《你真的完全了解Java動態(tài)代理嗎?看這篇就夠了》介紹了下...
摘要:構(gòu)造函數(shù)注入通過調(diào)用類的構(gòu)造函數(shù),將接口實現(xiàn)類通過構(gòu)造函數(shù)變量傳入。而在中,其使用橫切技術(shù),將這類代碼從原屬的封裝對象中提取出來,封裝到一個可重用模塊中,稱為。 最近實習(xí)用到Spring的開發(fā)框架,但是之前沒有接觸過,因此希望利用網(wǎng)上的資源來學(xué)習(xí)以下。 Spring官方給出了非常全面的介紹,非常適合我這種完全的小白……在這一系列學(xué)習(xí)中,我閱讀的主要資源是5.1.2 Reference ...
摘要:本文首發(fā)于作者最近在學(xué),研究了下和代理模式,寫點心得和大家分享下。所以下面來重點分析下代理模式。這里代理模式分為靜態(tài)代理和動態(tài)代理兩種,我們分別來看下。代理模式,代理,意味著有一方代替另一方完成一件事。 本文首發(fā)于 https://jaychen.cc作者 jaychen 最近在學(xué) Spring,研究了下 AOP 和代理模式,寫點心得和大家分享下。 AOP 先說下AOP,AOP 全稱 ...
閱讀 1024·2021-10-27 14:15
閱讀 2778·2021-10-25 09:45
閱讀 1942·2021-09-02 09:45
閱讀 3370·2019-08-30 15:55
閱讀 1807·2019-08-29 16:05
閱讀 3204·2019-08-28 18:13
閱讀 3118·2019-08-26 13:58
閱讀 457·2019-08-26 12:01