預(yù)熱
? ? ? ?在說AOP之前先來(lái)說說java最經(jīng)典的OOP(面向?qū)ο缶幊蹋覀兺ㄟ^面向?qū)ο蟮姆庋b思想把同一類事物的共性歸為一類中碱妆,方便我們統(tǒng)一管理唇牧。比如我們會(huì)把汽車的輪子,發(fā)動(dòng)機(jī)咨跌,車身噴漆都放在汽車這個(gè)類中。這樣的好處是良好的封裝能夠減少耦合硼婿,隱藏信息實(shí)現(xiàn)細(xì)節(jié)锌半。但是試想一下如果每個(gè)類中有沒有重復(fù)調(diào)用的代碼呢?比如日志輸出寇漫、緩存處理刊殉。這里就需要用到AOP思想了。
什么是AOP編程
AOP為Aspect Oriented Programming的縮寫州胳,意為:面向切面編程记焊,通過預(yù)編譯方式和運(yùn)行期動(dòng)態(tài)代理實(shí)現(xiàn)程序功能的統(tǒng)一維護(hù)的一種技術(shù)。
? ? ? ?上面是AOP的定義栓撞,比較抽象遍膜。我們接著上面來(lái)說,如果兩個(gè)類都有做緩存處理瓤湘,那么我們就需要在兩個(gè)類中寫同樣的關(guān)于緩存的代碼瓢颅。既然是相同代碼那肯定可以做封裝嘛,但我們封裝一個(gè)緩存工具類然后去掉用弛说,上面兩個(gè)類又和緩存類耦合了挽懦。那么,有沒有什么辦法木人,能讓我們?cè)谛枰臅r(shí)候信柿,隨意地加入代碼呢?
? ? ? ?這種在運(yùn)行時(shí)醒第,動(dòng)態(tài)地將代碼切入到類的指定方法角塑、指定位置上的編程思想就是面向切面的編程。
? ? ? ?一般而言淘讥,我們管切入到指定類指定方法的代碼片段稱為切面,而切入到哪些類堤如、哪些方法則叫切入點(diǎn)蒲列。有了AOP窒朋,我們就可以把幾個(gè)類共有的代碼,抽取到一個(gè)切片中蝗岖,等到需要時(shí)再切入對(duì)象中去侥猩,從而改變其原有的行為。
? ? ? ?這樣看來(lái)抵赢,AOP其實(shí)只是OOP的補(bǔ)充而已欺劳。OOP從橫向上區(qū)分出一個(gè)個(gè)的類來(lái),而AOP則從縱向上向?qū)ο笾屑尤胩囟ǖ拇a铅鲤。有了AOP划提,OOP變得立體了。如果加上時(shí)間維度邢享,AOP使OOP由原來(lái)的二維變?yōu)槿S了鹏往,由平面變成立體了。
? ? ? ?AOP在編程歷史上可以說是里程碑式的骇塘,對(duì)OOP編程是一種十分有益的補(bǔ)充伊履。
引用知乎上一個(gè)圖作為補(bǔ)充說明
面向切面,面向方面款违,也叫刀削面唐瀑,蘸料是切面,刀削面是切入點(diǎn)插爹,把蘸料加入到刀削面中哄辣,就是把切面(要切入的代碼段)切入到切入點(diǎn)中去。即AOP递惋。哈哈柔滔,我覺得很到位。