1.我所知道的aop
初看aop,上來就是一大堆術語,而且還有個拉風的名字,面向切面編程,都說是OOP的一種有益補充等等。一下子讓你不知所措,心想着:怪不得很多人都和我說aop多難多難。當我看進去以后,我才發現:它就是一些java基礎上的朴實無華的應用,包括ioc,包括許許多多這樣的名詞,都是萬變不離其宗而已。
2.為什么用aop
1就是為了方便,看一個國外很有名的大師說,編程的人都是“懶人”,因為他把自己做的事情都讓程序做了。用了aop能讓你少寫很多代碼,這點就夠充分了吧
2就是為了更清晰的邏輯,可以讓你的業務邏輯去關注自己本身的業務,而不去想一些其他的事情,這些其他的事情包括:安全,事物,日志等。
3.那些aop的術語
1、AOP術語
1)連接點(Joinpoint)
程序執行的某個特定位置:如類開始初始化前、類初始化后、類某個方法調用前、調用后、方法拋出異常后。一個類或一段程序代碼擁有一些具有邊界性質的特定點,這些點中的特定點就稱為“連接點”。Spring僅支持方法的連接點,即僅能在方法調用前、方法調用后、方法拋出異常時以及方法調用前后這些程序執行點織入增強。連接點由兩個信息確定:第一是用方法表示的程序執行點;第二是用相對點表示的方位。
2)切點(Pointcut)
每個程序類都擁有多個連接點,如一個擁有兩個方法的類,這兩個方法都是連接點,即連接點是程序類中客觀存在的事物。AOP通過“切點”定位特定的連接點。連接點相當於數據庫中的記錄,而切點相當於查詢條件。切點和連接點不是一對一的關系,一個切點可以匹配多個連接點。在Spring中,切點通過org.springframework.aop.Pointcut接口進行描述,它使用類和方法作為連接點的查詢條件,Spring AOP的規則解析引擎負責切點所設定的查詢條件,找到對應的連接點。其實確切地說,不能稱之為查詢連接點,因為連接點是方法執行前、執行后等包括方位信息的具體程序執行點,而切點只定位到某個方法上,所以如果希望定位到具體連接點上,還需要提供方位信息。
3)增強(Advice)
增強是織入到目標類連接點上的一段程序代碼,在Spring中,增強除用於描述一段程序代碼外,還擁有另一個和連接點相關的信息,這便是執行點的方位。結合執行點方位信息和切點信息,我們就可以找到特定的連接點。
4)目標對象(Target)
增強邏輯的織入目標類。如果沒有AOP,目標業務類需要自己實現所有邏輯,而在AOP的幫助下,目標業務類只實現那些非橫切邏輯的程序邏輯,而性能監視和事務管理等這些橫切邏輯則可以使用AOP動態織入到特定的連接點上。
5)引介(Introduction)
引介是一種特殊的增強,它為類添加一些屬性和方法。這樣,即使一個業務類原本沒有實現某個接口,通過AOP的引介功能,我們可以動態地為該業務類添加接口的實現邏輯,讓業務類成為這個接口的實現類。
6)織入(Weaving)
織入是將增強添加對目標類具體連接點上的過程。AOP像一台織布機,將目標類、增強或引介通過AOP這台織布機天衣無縫地編織到一起。根據不同的實現技術,AOP有三種織入的方式:
a、編譯期織入,這要求使用特殊的Java編譯器。
b、類裝載期織入,這要求使用特殊的類裝載器。
c、動態代理織入,在運行期為目標類添加增強生成子類的方式。
Spring采用動態代理織入,而AspectJ采用編譯期織入和類裝載期織入。
7)代理(Proxy)
一個類被AOP織入增強后,就產出了一個結果類,它是融合了原類和增強邏輯的代理類。根據不同的代理方式,代理類既可能是和原類具有相同接口的類,也可能就是原類的子類,所以我們可以采用調用原類相同的方式調用代理類。
8)切面(Aspect)
切面由切點和增強(引介)組成,它既包括了橫切邏輯的定義,也包括了連接點的定義,Spring AOP就是負責實施切面的框架,它將切面所定義的橫切邏輯織入到切面所指定的連接點中。