Spring IoC 和 AOP 的理解

IoC

IoC(Inverse of Control,即控制反轉(zhuǎn))是一種設(shè)計(jì)思想,就是將原本在程序中手動(dòng)創(chuàng)建對(duì)象的控制權(quán),交由 Spring 框架來(lái)管理。 IoC 在其他語(yǔ)言中也有應(yīng)用,并非 Spirng 特有。IoC 容器是 Spring 用來(lái)實(shí)現(xiàn) IoC 的載體, IoC 容器實(shí)際上就是個(gè) Map(key,value), Map 中存放的是各種對(duì)象。

將對(duì)象之間的相互依賴關(guān)系交給 IoC 容器來(lái)管理,并由 IoC 容器完成對(duì)象的注入,這樣可以很大程度上簡(jiǎn)化應(yīng)用的開發(fā),把應(yīng)用從復(fù)雜的依賴關(guān)系中解放出來(lái)。IoC 容器就像是一個(gè)工廠一樣,當(dāng)需要?jiǎng)?chuàng)建一個(gè)對(duì)象的時(shí)候,只需要配置好配置文件/注解即可,完全不用考慮對(duì)象是如何被創(chuàng)建出來(lái)的。在實(shí)際項(xiàng)目中,一個(gè) Service 類可能有幾百甚至上千個(gè)類作為它的底層,假如我們需要實(shí)例化這個(gè) Service,你可能要每次都要搞清這個(gè) Service 所有底層類的構(gòu)造函數(shù),這可能會(huì)把人逼瘋。如果利用 IoC 的話,你只需要配置好,然后在需要的地方引用,這大大增加了項(xiàng)目的可維護(hù)性,且降低了開發(fā)的難度。

Spring 時(shí)代,我們一般通過 XML 文件來(lái)配置 Bean,后來(lái)有人覺得 XML 文件來(lái)配置不太好,于是 Spring Boot 注解配置就慢慢開始流行起來(lái)。

Spring IoC的初始化過程

AOP

AOP(Aspect-Oriented Programming,即面向切面編程)將那些與業(yè)務(wù)無(wú)關(guān),卻為業(yè)務(wù)模塊所共同調(diào)用的邏輯或責(zé)任(例如事務(wù)處理、日志管理、權(quán)限控制等)封裝起來(lái),便于減少系統(tǒng)的重復(fù)代碼,降低模塊間的耦合度,有利于系統(tǒng)的可拓展性和可維護(hù)性

Spring AOP 就是基于動(dòng)態(tài)代理實(shí)現(xiàn)的。如果被代理的對(duì)象,實(shí)現(xiàn)了某個(gè)接口,那么 Spring AOP 會(huì)使用JDK Proxy,去創(chuàng)建該代理對(duì)象,而對(duì)于沒有實(shí)現(xiàn)接口的對(duì)象,就無(wú)法使用 JDK Proxy 去進(jìn)行代理了,這時(shí)候 Spring AOP 會(huì)使用 Cglib 生成一個(gè)被代理對(duì)象的子類來(lái)作為代理,如下圖所示:

Spring AOP Process

當(dāng)然還可以使用 AspectJ ,Spring AOP 已經(jīng)集成了 AspectJ ,AspectJ 算的上是 Java 生態(tài)系統(tǒng)中最完整的 AOP 框架。

使用 AOP 之后,我們可以把一些通用功能抽象出來(lái),在需要用到的地方直接使用即可,這樣就可以大大簡(jiǎn)化代碼量。

Spring AOP 和 AspectJ AOP 有什么區(qū)別?

Spring AOP 屬于運(yùn)行時(shí)增強(qiáng),而 AspectJ 是編譯時(shí)增強(qiáng)。 Spring AOP 基于代理 (Proxying),而 AspectJ 基于字節(jié)碼操作 (Bytecode Manipulation)。

AspectJ 相比于 Spring AOP 功能更加強(qiáng)大,但是 Spring AOP 相對(duì)來(lái)說(shuō)更簡(jiǎn)單,如果切面功能比較少,那么兩者性能差異不大。但是,當(dāng)切面太多的話,最好選擇 AspectJ ,它比 Spring AOP 要快很多。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容