簡(jiǎn)單理解IOC和AOP的原理

IOC,依賴倒置的意思,

所謂依賴,從程序的角度看,就是比如A要調(diào)用B的方法,那么A就依賴于B,反正A要用到B,則A依賴于B。

所謂倒置,你必須理解如果不倒置,會(huì)怎么著,因?yàn)锳必須要有B,才可以調(diào)用B,如果不倒置,意思就是A主動(dòng)獲取B的實(shí)例:B?b?=?new?B(),這就是最簡(jiǎn)單的獲取B實(shí)例的方法(當(dāng)然還有各種設(shè)計(jì)模式可以幫助你去獲得B的實(shí)例,比如工廠、Locator等等),然后你就可以調(diào)用b對(duì)象了。

所以,不倒置,意味著A要主動(dòng)獲取B,才能使用B;到了這里,你就應(yīng)該明白了倒置的意思了。倒置就是A要調(diào)用B的話,A并不需要主動(dòng)獲取B,而是由其它人自動(dòng)將B送上門來(lái)。

形象的舉例就是:

通常情況下,假如你有一天在家里口渴了,要喝水,那么你可以到你小區(qū)的小賣部去,告訴他們,你需要一瓶水,然后小賣部給你一瓶水!

這本來(lái)沒(méi)有太大問(wèn)題,關(guān)鍵是如果小賣部很遠(yuǎn),那么你必須知道:從你家如何到小賣部;小賣部里是否有你需要的水;你還要考慮是否開著車去;等等等等,也許有太多的問(wèn)題要考慮了。也就是說(shuō),為了一瓶水,你還可能需要依賴于車等等這些交通工具或別的工具,問(wèn)題是不是變得復(fù)雜了?那么如何解決這個(gè)問(wèn)題呢?

解決這個(gè)問(wèn)題的方法很簡(jiǎn)單:小賣部提供送貨上門服務(wù),凡是小賣部的會(huì)員,你只要告知小賣部你需要什么,小賣部將主動(dòng)把貨物給你送上門來(lái)!這樣一來(lái),你只需要做兩件事情,你就可以活得更加輕松自在:

第一:向小賣部注冊(cè)為會(huì)員

第二:告訴小賣部你需要什么

是不是和Spring的做法很類似呢?Spring就是小賣部,你就是A對(duì)象,水就是B對(duì)象

第一:在Spring中聲明一個(gè)類:A

第二:告訴Spring,A需要B

假設(shè)A是UserAction類,而B是UserService類

在Spring這個(gè)商店(工廠)中,有很多對(duì)象/服務(wù):userService,documentService,orgService,也有很多會(huì)員:userAction等等,聲明userAction需要userService即可,Spring將通過(guò)你給它提供的通道主動(dòng)把userService送上門來(lái),因此UserAction的代碼示例類似如下所示:


在這段代碼里面,你無(wú)需自己創(chuàng)建UserService對(duì)象(Spring作為背后無(wú)形的手,把UserService對(duì)象通過(guò)你定義的setUserService()方法把它主動(dòng)送給了你,這就叫依賴注入?。?/p>

Spring依賴注入的實(shí)現(xiàn)技術(shù)是:動(dòng)態(tài)代理

---------------------------------------------------

再說(shuō)說(shuō)AOP,即面向切面編程,面向切面編程的目標(biāo)就是分離關(guān)注點(diǎn)。什么是關(guān)注點(diǎn)呢,就是你要做的事,就是關(guān)注點(diǎn)。假如你是個(gè)公子哥,沒(méi)啥人生目標(biāo),天天就是衣來(lái)伸手,飯來(lái)張口,整天只知道玩一件事!那么,每天你一睜眼,就光想著吃完飯就去玩(你必須要做的事),但是在玩之前,你還需要穿衣服、穿鞋子、疊好被子、做飯等等等等事情,這些事情就是你的關(guān)注點(diǎn),但是你只想吃飯然后玩,那么怎么辦呢?這些事情通通交給別人去干。在你走到飯桌之前,有一個(gè)專門的仆人A幫你穿衣服,仆人B幫你穿鞋子,仆人C幫你疊好被子,仆人C幫你做飯,然后你就開始吃飯、去玩(這就是你一天的正事),你干完你的正事之后,回來(lái),然后一系列仆人又開始幫你干這個(gè)干那個(gè),然后一天就結(jié)束了!

AOP的好處就是你只需要干你的正事,其它事情別人幫你干。也許有一天,你想裸奔,不想穿衣服,那么你把仆人A解雇就是了!也許有一天,出門之前你還想帶點(diǎn)錢,那么你再雇一個(gè)仆人D專門幫你干取錢的活!這就是AOP。每個(gè)人各司其職,靈活組合,達(dá)到一種可配置的、可插拔的程序結(jié)構(gòu)。

從Spring的角度看,AOP最大的用途就在于提供了事務(wù)管理的能力。事務(wù)管理就是一個(gè)關(guān)注點(diǎn),你的正事就是去訪問(wèn)數(shù)據(jù)庫(kù),而你不想管事務(wù)(太煩),所以,Spring在你訪問(wèn)數(shù)據(jù)庫(kù)之前,自動(dòng)幫你開啟事務(wù),當(dāng)你訪問(wèn)數(shù)據(jù)庫(kù)結(jié)束之后,自動(dòng)幫你提交/回滾事務(wù)!

最后編輯于
?著作權(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)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,564評(píng)論 19 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 47,273評(píng)論 6 342
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,048評(píng)論 25 709
  • 死生契闊,與子成說(shuō),執(zhí)子之手,與子偕老 一同生死不分離,我們?cè)缫蚜⑹难?。讓我握住你的手,同生共死上?zhàn)場(chǎng) ——題記 ...
    瀟瀟寧閱讀 444評(píng)論 0 0
  • 有一天 開始從平淡日子感受快樂(lè) 看到了明明白白的遠(yuǎn)方 我要的幸福 我要穩(wěn)穩(wěn)的幸福 能抵擋末日的殘酷 在不安的深夜 ...
    我在馬路邊丟了一分錢閱讀 225評(píng)論 0 0

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