天天看點

Spring 複盤 | AOP

spring aop 基礎 java 動态代理實作,閱讀文章之前,你最好有以下基礎:

java動态代理

aop(aspect oriented programming),即面向切面程式設計,它是 oop(object oriented programming,面向對象程式設計)的補充和完善。

在開發中,功能點通常分為橫向關注點和核心關注點,核心關注點就是業務關注的點,大部分是要給使用者看的。而橫向關注點是使用者不關心,而我們程式又必須實作的,它的特點是橫向分布于核心關注點各處,比如日志功能,核心關注點:增删改查都需要實作日志功能。如果用 面向對象程式設計來實作的話,那增删改查都需要寫一遍日志代碼,這會造成非常多備援代碼,顯然是不合理的。而此時,aop 應運而生。它統一定義了,何時、何處執行這些橫向功能點

要了解 aop 首先要認識以下相關術語,有這麼個場景,我需要給使用者子產品的增删改查,實作日志功能,我現在通過這個場景來解釋以上術語。

連接配接點(joinpoint)

被攔截到的點,因為 spring 隻支援方法類型的連接配接點,是以在 spring 中連接配接點指的就是被攔截到的方法。場景中,連接配接點就是增删改查方法本身。

通知(advice)

所謂通知指的就是指攔截到連接配接點之後要執行的代碼,通知分為前置、後置、異常、最終、環繞通知五類。

1、前置通知(before):在目标方法被調用之前調用通知功能;

2、後置通知(after):在目标方法完成之後調用通知,此時不會關

心方法的輸出是什麼;

3、傳回通知(after-returning):在目标方法成功執行之後調用通

知;

4、異常通知(after-throwing):在目标方法抛出異常後調用通知;

5、環繞通知(around):通知包裹了被通知的方法,在被通知的方

法調用之前和調用之後執行自定義的行為。

切點(pointcut)

對連接配接點進行攔截的定義,它會比對通知所要織入的一個或多個連接配接點。它的格式是這樣的:

切面(aspect)

類是對物體特征的抽象,切面就是對橫切關注點的抽象,它定義了切點和通知。場景中,日志功能就是這個抽象,它定義了你要對攔截方法做什麼?切面是通知和切點的結合。通知和切點共同定義了切面的全部内容——它是什麼,在何時和何處完成其功能。

織入(weave)

将切面應用到目标對象并導緻代理對象建立的過程

引入(introduction)

在不修改代碼的前提下,引入可以在運作期為類動态地添加一些方法或字段

首先,定義一個加減乘除的接口,代碼如下:

定義一個實作類,代碼如下:

定義切面,代碼如下:

xml 配置,代碼如下:

測試方法:

測試結果:

關于 xml 的實作方式,網上發現一篇文章寫的不錯,此處,不再贅述,有興趣的參考以下連結:

www.cnblogs.com/hongwz/p/57…

github.com/turodog/rev…