摘要:初識(shí)面向切面編程的定義是什么目前自己的理解是把一個(gè)函數(shù)動(dòng)態(tài)的的插入到另外一個(gè)函數(shù)當(dāng)中,就像一個(gè)鉤子一樣。面向切面編程是的首字母縮寫(xiě),我們知道,面向?qū)ο蟮奶攸c(diǎn)是繼承多態(tài)和封裝。
初識(shí)AOP(面向切面編程) AOP的定義
AOP是什么?目前自己的理解是把一個(gè)函數(shù)‘動(dòng)態(tài)的的插入’到另外一個(gè)函數(shù)當(dāng)中,就像一個(gè)鉤子一樣。下面是詳細(xì)的定義。
面向切面編程(AOP是Aspect Oriented Program的首字母縮寫(xiě)) ,我們知道,面向?qū)ο蟮奶攸c(diǎn)是繼承、多態(tài)和封裝。而封裝就要求將功能分散到不同的對(duì)象中去,這在軟件設(shè)計(jì)中往往稱(chēng)為職責(zé)分配。實(shí)際上也就是說(shuō),讓不同的類(lèi)設(shè)計(jì)不同的方法。這樣代碼就分散到一個(gè)個(gè)的類(lèi)中去了。這樣做的好處是降低了代碼的復(fù)雜程度,使類(lèi)可重用。
但是人們也發(fā)現(xiàn),在分散代碼的同時(shí),也增加了代碼的重復(fù)性。什么意思呢?比如說(shuō),我們?cè)趦蓚€(gè)類(lèi)中,可能都需要在每個(gè)方法中做日志。按面向?qū)ο蟮脑O(shè)計(jì)方法,我們就必須在兩個(gè)類(lèi)的方法中都加入日志的內(nèi)容。也許他們是完全相同的,但就是因?yàn)槊嫦驅(qū)ο蟮脑O(shè)計(jì)讓類(lèi)與類(lèi)之間無(wú)法聯(lián)系,而不能將這些重復(fù)的代碼統(tǒng)一起來(lái)。
也許有人會(huì)說(shuō),那好辦啊,我們可以將這段代碼寫(xiě)在一個(gè)獨(dú)立的類(lèi)獨(dú)立的方法里,然后再在這兩個(gè)類(lèi)中調(diào)用。但是,這樣一來(lái),這兩個(gè)類(lèi)跟我們上面提到的獨(dú)立的類(lèi)就有耦合了,它的改變會(huì)影響這兩個(gè)類(lèi)。那么,有沒(méi)有什么辦法,能讓我們?cè)谛枰臅r(shí)候,隨意地加入代碼呢?這種在運(yùn)行時(shí),動(dòng)態(tài)地將代碼切入到類(lèi)的指定方法、指定位置上的編程思想就是面向切面的編程。
一般而言,我們管切入到指定類(lèi)指定方法的代碼片段稱(chēng)為切面,而切入到哪些類(lèi)、哪些方法則叫切入點(diǎn)。有了AOP,我們就可以把幾個(gè)類(lèi)共有的代碼,抽取到一個(gè)切片中,等到需要時(shí)再切入對(duì)象中去,從而改變其原有的行為。
這樣看來(lái),AOP其實(shí)只是OOP的補(bǔ)充而已。OOP從橫向上區(qū)分出一個(gè)個(gè)的類(lèi)來(lái),而AOP則從縱向上向?qū)ο笾屑尤胩囟ǖ拇a。有了AOP,OOP變得立體了。如果加上時(shí)間維度,AOP使OOP由原來(lái)的二維變?yōu)槿S了,由平面變成立體了。從技術(shù)上來(lái)說(shuō),AOP基本上是通過(guò)代理機(jī)制實(shí)現(xiàn)的。
AOP在編程歷史上可以說(shuō)是里程碑式的,對(duì)OOP編程是一種十分有益的補(bǔ)充。
喜聞樂(lè)見(jiàn)的代碼Function.prototype.before = function(beforeFn) { var _self = this; // 保存原函數(shù)引用 return function(){ // 返回包含了原函數(shù)和新函數(shù)的‘代理’函數(shù) beforeFn.apply(this, arguments); // 執(zhí)行新函數(shù),修正this return _self.apply(this, arguments); // 執(zhí)行原函數(shù) } }; Function.prototype.after = function(afterFn) { var _self = this; return function(){ var ret = _self.apply(this, arguments); afterFn.apply(this, arguments); return ret; } } var obj = { name: "tangdy", before: "this is before", after: "this is after", method: function(){ console.log(this.name); } } obj.method = obj.method.before(function(){ console.log(this.before) }).after(function(){ console.log(this.after) }); obj.method(); // this is before // tangdy // this is after
before和after都會(huì)返回一個(gè)新的函數(shù)(一個(gè)函數(shù)外殼),將原來(lái)的函數(shù)儲(chǔ)存到新的函數(shù)當(dāng)中,同時(shí)把傳入的函數(shù)也儲(chǔ)存到新的函數(shù)。
var _self = this; // 保存原函數(shù)引用此處的this為什么會(huì)是原函數(shù)的引用?
調(diào)用時(shí)的語(yǔ)法:obj.method.before(...);before的前一個(gè)調(diào)用棧是method,所以before內(nèi)部的this采用了隱式綁定,this就是method。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://hztianpu.com/yun/81608.html
摘要:面向切面的本章主要內(nèi)容面向切面編程的基本原理通過(guò)創(chuàng)建切面使用注解為切面注入依賴(lài)。什么是面向切面編程切面能夠幫我們模塊化橫切關(guān)注點(diǎn)。在使用面向切面編程時(shí),我們?nèi)匀辉谝粋€(gè)地方定義通知功能,而無(wú)需修改受影響的類(lèi)。切面切面是通知和切點(diǎn)的結(jié)合。 面向切面的Spring 本章主要內(nèi)容: 面向切面編程的基本原理 通過(guò)POJO創(chuàng)建切面 使用@Aspect注解 為AspectJ切面注入依賴(lài)。 說(shuō)明 ...
摘要:而面向切面編程理所當(dāng)然關(guān)注于切面,那么什么是切面可以理解為程序執(zhí)行時(shí)的某個(gè)節(jié)點(diǎn),或更具體一點(diǎn),在某個(gè)方法執(zhí)行之前,執(zhí)行之后,返回之后等其它節(jié)點(diǎn)。術(shù)語(yǔ)一個(gè)切面,可以理解為一個(gè)切面模塊,將相關(guān)的增強(qiáng)內(nèi)容寫(xiě)進(jìn)同一個(gè)切面。例如一個(gè)負(fù)責(zé)日志的切面。 AOP是什么 AOP全稱(chēng) Aspect-Oriented Programming 即面向切面編程。怎么樣,是不是感覺(jué)很熟悉?對(duì),類(lèi)似的還有面向過(guò)程編...
摘要:模塊負(fù)責(zé)的所有面向切面的功能。總結(jié)的統(tǒng)一管理,降低了對(duì)象之間的耦合對(duì)主流的框架提供了很好的集成支持提供眾多組件,事務(wù)管理,等具有高度可開(kāi)放性,開(kāi)發(fā)者可以自由選擇部分或全部主要使用工廠模式和代理模式。 聊完了Spring框架中最重要的兩種設(shè)計(jì)模式,我們來(lái)看一下Spring框架的模塊和結(jié)構(gòu)圖。 Spring框架的結(jié)構(gòu) 下圖是Spring官方給出的Spring框架的結(jié)構(gòu)圖。 showImg(...
摘要:序是的縮寫(xiě),中文翻譯是面向切面編程。首先面向切面編程這個(gè)名稱(chēng)很容易讓人想起面向?qū)ο缶幊虂?lái)。這種動(dòng)態(tài)地將代碼織入到類(lèi)的指定方法指定位置上的編程思想就是面向切面編程。概念面向切面編程具體的一些概念。 序 AOP是Aspect-Oriented Programming的縮寫(xiě),中文翻譯是面向切面編程。作為Spring的特征之一,是要好好學(xué)習(xí)的。 首先面向切面編程這個(gè)名稱(chēng)很容易讓人想起面向?qū)ο缶?..
摘要:,,面向切面編程。,切點(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)代理嗎?看這篇就夠了》介紹了下...
閱讀 1385·2023-04-26 02:20
閱讀 3504·2021-11-22 14:45
閱讀 4421·2021-11-17 09:33
閱讀 1185·2021-09-06 15:00
閱讀 1643·2021-09-03 10:30
閱讀 4146·2021-07-26 22:01
閱讀 1134·2019-08-30 15:54
閱讀 684·2019-08-30 15:43