@JFinal 波總在 JFinal 4.8 發(fā)布新聞的評論 中給出了下面的表述:
IOC 本質(zhì)是為了實(shí)現(xiàn) AOP
我有點(diǎn)吃驚, 沒想到 Java 界的大佬對這兩個(gè)概念有和我完全不一致的認(rèn)識(shí). 所以寫下這篇博客, 并借此機(jī)會(huì)重新學(xué)習(xí)一下 IoC 和 AOP, 確保自己對這兩個(gè)后端開發(fā)非常重要的概念不會(huì)有太過偏差的理解
1. IoC
IoC 是 Inversion of Control 的縮寫, 中文意思是控制反轉(zhuǎn). 維基百科對 IoC 開宗明義的定位為:
In software engineering, inversion of control (IoC) is a programming principle
維基文中對此有詳細(xì)的闡述, 大家可以自行前往維基百科 Inversion_of_control 詞條查看, 我就不一一 Copy/Paste 了. 這里幫大家檢出幾個(gè)關(guān)鍵地方捋一捋:
- IoC 是編程原則 - 不是特定的產(chǎn)品, 不是具體實(shí)現(xiàn)方式, 當(dāng)然也和具體編程語言無關(guān)
- 在傳統(tǒng)編程范式中, 程序調(diào)用可重用的庫
- 在 IoC 原則下, 程序接受通用框架的調(diào)用控制 - 框架調(diào)用程序代碼
- 與 IoC 原則相關(guān)的概念包括:
- IoC 的設(shè)計(jì)目的包括:
- 將執(zhí)行任務(wù)和任務(wù)實(shí)現(xiàn)解耦
- 讓模塊專注于設(shè)計(jì)任務(wù)
- 模塊僅依賴于設(shè)計(jì)契約而無需關(guān)注其他系統(tǒng)如何工作
- 避免模塊替換時(shí)的副作用
到這里我們可以比較清楚地得出下面的結(jié)論了:
J1. IoC 的本質(zhì)不是為了實(shí)現(xiàn) AOP.
J2. 波總的 JFinal 已經(jīng)實(shí)現(xiàn)了 IoC 原則. 因?yàn)閼?yīng)用寫的代碼總是被 JFinal 的代碼調(diào)用, 這就是控制反轉(zhuǎn).
那為什么波總會(huì)說 "IOC 本質(zhì)是為了實(shí)現(xiàn) AOP" 呢? 我姑且胡亂猜測一下, 波總想說的有可能是 "DI 本質(zhì)是為了實(shí)現(xiàn) AOP". 下面我們來探討一下 DI, 這個(gè)和 IoC 以及 AOP 都有關(guān)系的概念.
2. DI
DI - Dependency Injection, 中文叫依賴注入, 在維基百科中的定義為:
In software engineering, dependency injection is a technique whereby one object supplies the dependencies of another object.
特別地, 維基百科中的 DI 詞條給出了下面的描述:
Passing the service to the client, rather than allowing a client to build or find the service, is the fundamental requirement of the pattern.
The intent behind dependency injection is to achieve Separation of Concerns of construction and use of objects. This can increase readability and code reuse.
上面在對 DI 的描述中引入了另一個(gè)概念: SoC (Separation of Concern), 中文名關(guān)注點(diǎn)分離. 這是計(jì)算機(jī)科學(xué)中的一條設(shè)計(jì)原則, 簡單地說就是將計(jì)算機(jī)程序劃分為獨(dú)立的單元, 每個(gè)單元解決一個(gè)可分離的關(guān)注點(diǎn). 這個(gè)概念和封裝 (Encapsulation) 非常接近, 可以說封裝是對 SoC 設(shè)計(jì)原則的一種具體實(shí)現(xiàn). 而 DI 則被描述為在構(gòu)造和使用對象上實(shí)現(xiàn) SoC 這個(gè)設(shè)計(jì)原則.
從上面的表述我們可以得到第三條結(jié)論:
J3. DI 也不是為了實(shí)現(xiàn) AOP
那 DI 或者 IoC 到底和 AOP 有沒有關(guān)系, 我們先來看看 AOP 的定義
3. AOP
AOP - Aspect Oriented Programming 在維基百科中的定義為:
In computing, aspect-oriented programming (AOP) is a programming paradigm that aims to increase modularity by allowing the separation of cross-cutting concerns.
這里面有幾個(gè)關(guān)鍵點(diǎn):
- AOP 是一個(gè)編程范式. 聽上去有點(diǎn)晦澀, 下面列舉幾個(gè)編程范式的例子可以幫助大家理解這個(gè)概念:
- Imperative - 指令式, c, c++, Java
- Declarative - 聲明式, SQL, 各種 DSL, 比如 ANTLR 的語法文件
- AOP 的目的是通過分離橫切關(guān)注點(diǎn)(Separation of cross-cutting concern) 來提高模塊性.
這里的 Separation of cross-cutton conern 是不是有點(diǎn)耳熟? 回顧上面提到的 DI 描述中引入的 Separation of Concern, 兩個(gè)概念字面相近, 但又不完全一致. AOP 關(guān)注的是切面, 而 DI 關(guān)注的是對象構(gòu)造. 如果沒有注意到這個(gè)異同處, 有可能將 DI (甚至 IoC) 和 AOP 的概念攪和到一起.
擴(kuò)展討論
無獨(dú)有偶, 前段時(shí)間 drinkjava (@yong9981) 同學(xué)也和我就 AOP 以及 DI 的關(guān)系進(jìn)行了比較深入的探討, 話題包括:
- AOP 的實(shí)現(xiàn)是否必須有 DI 提供
- Web 框架是否必須提供通用 AOP 的實(shí)現(xiàn)
- 聲明式事務(wù)是否必須采用 AOP 來提供

我自己建了個(gè)群,對 JAVA 開發(fā)有興趣的朋友歡迎加入QQ群:976203838 進(jìn)行技術(shù)討論,里面資深架構(gòu)師會(huì)分享一些整理好的BATJ面試題:有Spring,MyBatis,Netty源碼分析,高并發(fā)、高性能、分布式、微服務(wù)架構(gòu)的原理,JVM性能優(yōu)化、分布式架構(gòu)等這些成為架構(gòu)師必備的知識(shí)體系。

作者:羅格林
出處:開源中國