成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

理解 Java AOP 《一》

GeekGhc / 2800人閱讀

摘要:擴(kuò)展了語(yǔ)言,定義了語(yǔ)法,所以它有一個(gè)專門(mén)的編譯器用來(lái)生成遵守字節(jié)碼規(guī)范的文件注意此,非。只是提供了和語(yǔ)法一致的語(yǔ)義注解,兩者是完全不同的實(shí)現(xiàn)。修改類(lèi)運(yùn)行時(shí),在內(nèi)通過(guò)轉(zhuǎn)換類(lèi)的字節(jié)碼,把橫切邏輯織入到目標(biāo)類(lèi)中。

AOP概述

AOP(Aspect-Oriented Programming,面向切面的編程)是一種編程范式,專注于解耦業(yè)務(wù)邏輯和橫切邏輯,從而達(dá)到提升內(nèi)聚和模塊化的目的。

業(yè)務(wù)邏輯 :處理業(yè)務(wù)的邏輯。

橫切邏輯 :通常固定的出現(xiàn)在業(yè)務(wù)邏輯的邊界處,在進(jìn)入業(yè)務(wù)邏輯前或執(zhí)行業(yè)務(wù)邏輯后做一些事情。

看一個(gè)例子:

橫切邏輯

public class PerformanceMonitor {

    public void start() {
        System.out.println("開(kāi)始時(shí)間: " + String.valueOf(System.currentTimeMillis()));
    }

    public void end() {
        System.out.println("結(jié)束時(shí)間: " + 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();
    }
}

上面例子中,我們希望通過(guò)PerformanceMonitor打印業(yè)務(wù)執(zhí)行開(kāi)始和結(jié)束時(shí)間,乍眼一看似乎沒(méi)毛病。

那問(wèn)題來(lái)了,如果我希望:

在調(diào)試階段才打印開(kāi)始和結(jié)束時(shí)間,應(yīng)用發(fā)布后不打印。

希望在其他業(yè)務(wù)邏輯開(kāi)始和結(jié)束的時(shí)候也打印時(shí)間。

按照現(xiàn)在的處理方式,業(yè)務(wù)邏輯和橫切邏輯耦合在了一起,需要滿足上述需求的話,需要修改代碼后再重新編譯,顯然這種處理方式不夠優(yōu)美。

AOP就是一種優(yōu)美的處理方式,如下:

Java AOP的實(shí)現(xiàn)方式

Java中實(shí)現(xiàn)AOP的方式分 靜態(tài)AOP動(dòng)態(tài)AOP 兩大類(lèi),下面分別列舉。

靜態(tài)AOP

在編譯期間,橫切邏輯直接以字節(jié)碼形式編譯到業(yè)務(wù)邏輯的字節(jié)碼文件中,通常需要特殊的編譯器。

Aspectj

Aspectj擴(kuò)展了java語(yǔ)言,定義了AOP語(yǔ)法,所以它有一個(gè)專門(mén)的編譯器(ajc)用來(lái)生成遵守Java字節(jié)碼規(guī)范的Class文件

注意 : 此Aspectj,非Spring Aspectj。Spring Aspectj只是提供了和Aspectj AOP語(yǔ)法一致的語(yǔ)義注解,兩者是完全不同的實(shí)現(xiàn)。

動(dòng)態(tài)AOP

在運(yùn)行期間,通過(guò)修改目標(biāo)類(lèi)的字節(jié)碼、生成類(lèi)的子類(lèi)或代理類(lèi)織入橫切邏輯。

生成接口代理類(lèi)(JDK動(dòng)態(tài)代理)

運(yùn)行時(shí),通過(guò)為目標(biāo)類(lèi)實(shí)現(xiàn)的接口動(dòng)態(tài)生成代理類(lèi),把橫切邏輯織入到代理類(lèi)中。

生成子類(lèi)

運(yùn)行時(shí),通過(guò)為目標(biāo)類(lèi)生成子類(lèi),把橫切邏輯織入到子類(lèi)中。

自定義 ClassLoader(修改類(lèi))

運(yùn)行時(shí),在類(lèi)加載器加載類(lèi)的時(shí)候,修改目標(biāo)類(lèi)的字節(jié)碼,把橫切邏輯織入到目標(biāo)類(lèi)中。

ClassFileTransformer(修改類(lèi))

運(yùn)行時(shí),在Java Agent內(nèi)通過(guò)Instrumentation轉(zhuǎn)換類(lèi)的字節(jié)碼,把橫切邏輯織入到目標(biāo)類(lèi)中。

AOP方式比較
AOP方式 效率 實(shí)現(xiàn)接口 final method 其他特點(diǎn)
Aspectj 編譯效率低,運(yùn)行效率高 不需要 支持 -
JDK動(dòng)態(tài)代理 生成代理效率高,執(zhí)行效率低 需要 N/A 通過(guò)反射方式調(diào)業(yè)務(wù)邏輯
生成子類(lèi) 生成子類(lèi)效率低,執(zhí)行效率高 不需要 不支持 -
自定義 ClassLoader 加載效率低,執(zhí)行效率高 不需要 支持 只能對(duì)自動(dòng)義類(lèi)加載器加載的類(lèi)織入
ClassFileTransformer 加載效率低,執(zhí)行效率高 不需要 支持 對(duì)所有類(lèi)織入

PS :未完待續(xù),后續(xù)章節(jié)針對(duì)每一種AOP方式舉例,實(shí)現(xiàn)PerformanceMonitor橫切邏輯的織入。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/67436.html

相關(guān)文章

  • Spring AOP就是這么簡(jiǎn)單啦

    摘要:是一種特殊的增強(qiáng)切面切面由切點(diǎn)和增強(qiáng)通知組成,它既包括了橫切邏輯的定義也包括了連接點(diǎn)的定義。實(shí)際上,一個(gè)的實(shí)現(xiàn)被拆分到多個(gè)類(lèi)中在中聲明切面我們知道注解很方便,但是,要想使用注解的方式使用就必須要有源碼因?yàn)槲覀円? 前言 只有光頭才能變強(qiáng) 上一篇已經(jīng)講解了Spring IOC知識(shí)點(diǎn)一網(wǎng)打盡!,這篇主要是講解Spring的AOP模塊~ 之前我已經(jīng)寫(xiě)過(guò)一篇關(guān)于AOP的文章了,那篇把比較重要的知...

    Jacendfeng 評(píng)論0 收藏0
  • 從源碼入手,文帶你讀懂Spring AOP面向切面編程

    摘要:,,面向切面編程。,切點(diǎn),切面匹配連接點(diǎn)的點(diǎn),一般與切點(diǎn)表達(dá)式相關(guān),就是切面如何切點(diǎn)。例子中,注解就是切點(diǎn)表達(dá)式,匹配對(duì)應(yīng)的連接點(diǎn),通知,指在切面的某個(gè)特定的連接點(diǎn)上執(zhí)行的動(dòng)作。,織入,將作用在的過(guò)程。因?yàn)樵创a都是英文寫(xiě)的。 之前《零基礎(chǔ)帶你看Spring源碼——IOC控制反轉(zhuǎn)》詳細(xì)講了Spring容器的初始化和加載的原理,后面《你真的完全了解Java動(dòng)態(tài)代理嗎?看這篇就夠了》介紹了下...

    wawor4827 評(píng)論0 收藏0
  • Spring框架學(xué)習(xí)筆記():官方文檔介紹,IoC與AOP概念學(xué)習(xí)

    摘要:構(gòu)造函數(shù)注入通過(guò)調(diào)用類(lèi)的構(gòu)造函數(shù),將接口實(shí)現(xiàn)類(lèi)通過(guò)構(gòu)造函數(shù)變量傳入。而在中,其使用橫切技術(shù),將這類(lèi)代碼從原屬的封裝對(duì)象中提取出來(lái),封裝到一個(gè)可重用模塊中,稱為。 最近實(shí)習(xí)用到Spring的開(kāi)發(fā)框架,但是之前沒(méi)有接觸過(guò),因此希望利用網(wǎng)上的資源來(lái)學(xué)習(xí)以下。 Spring官方給出了非常全面的介紹,非常適合我這種完全的小白……在這一系列學(xué)習(xí)中,我閱讀的主要資源是5.1.2 Reference ...

    mindwind 評(píng)論0 收藏0
  • Java 代理模式與 AOP

    摘要:本文首發(fā)于作者最近在學(xué),研究了下和代理模式,寫(xiě)點(diǎn)心得和大家分享下。所以下面來(lái)重點(diǎn)分析下代理模式。這里代理模式分為靜態(tài)代理和動(dòng)態(tài)代理兩種,我們分別來(lái)看下。代理模式,代理,意味著有一方代替另一方完成一件事。 本文首發(fā)于 https://jaychen.cc作者 jaychen 最近在學(xué) Spring,研究了下 AOP 和代理模式,寫(xiě)點(diǎn)心得和大家分享下。 AOP 先說(shuō)下AOP,AOP 全稱 ...

    jk_v1 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<