注意:IOC和AOP不是spring提出的,在Spring之前就已經(jīng)存在,只不過更偏向于理論化,Spring只是在技術(shù)層次把這兩個(gè)思想做了?常好的實(shí)現(xiàn)(基于Java語言)
一、IOC(Inversion of Control)控制反轉(zhuǎn)
1、什么是IOC?
IOC Inversion of Control (控制反轉(zhuǎn)/反轉(zhuǎn)控制),注意它是?個(gè)技術(shù)思想,不是?個(gè)技術(shù)實(shí)現(xiàn)
描述的事情:Java開發(fā)領(lǐng)域?qū)ο蟮膭?chuàng)建,管理的問題
-
傳統(tǒng)的開發(fā)方式:?如類A依賴于類B,往往會(huì)在類A中new?個(gè)B的對(duì)象
image.png
- 基于IOC思想下的開發(fā)方式:不再具體的類中去new一個(gè)對(duì)象,面是由Spring框架中的IOC容器去幫助我們實(shí)例化對(duì)象并且管理它們,當(dāng)需要使用到具體的哪一個(gè)對(duì)象的時(shí)候,直接從容器中獲取出來使用即可

在此過程我們喪失了?個(gè)權(quán)利(創(chuàng)建、管理對(duì)象的權(quán)利),得到了?個(gè)福利(不?考慮對(duì)象的創(chuàng)建、管理等?系列事情,全部交由IOC容器進(jìn)行管理)
為什么叫控制反轉(zhuǎn)?
控制:指的是對(duì)象創(chuàng)建(實(shí)例化、管理)的權(quán)利
反轉(zhuǎn):控制權(quán)交給外部環(huán)境了(Spring框架、IOC容器)
將需要人為控制進(jìn)行對(duì)象創(chuàng)建和管理的工作交由Spring框架進(jìn)行管理控制
2、 IOC解決了什么問題
IOC主要解決對(duì)象之間的耦合問題

如上圖,如果我們在Service層調(diào)用 Dao層的接口,通過new 關(guān)鍵字進(jìn)行依賴關(guān)系維護(hù),那么如果Dao層換了一個(gè)新的實(shí)現(xiàn)類,那么所有引用到這個(gè)Dao的地方都要進(jìn)行修改,如果使用IOC容器,直接通過申明接口類型,然后在容器啟動(dòng)時(shí)根據(jù)配置或注解進(jìn)行初始化,一定程度上減少了對(duì)象之間的依賴關(guān)系
3、 IOC和DI的區(qū)別
- DI:Dependancy Injection(依賴注?)
- IOC和DI所說的是同一件事情(對(duì)象實(shí)體化及依賴關(guān)系維護(hù)管理這件事情),只不過角度不同
- IOC是站在對(duì)象的角度,對(duì)象實(shí)例化及其管理的權(quán)利交給了容器進(jìn)行處理
-
DI是站在容器的角度,容器實(shí)例化對(duì)象的過程中,會(huì)把對(duì)象依賴的其它對(duì)象注入到其中,維護(hù)對(duì)象之間的依賴關(guān)系,比如A對(duì)象實(shí)例化過程中因?yàn)槁暶髁艘粋€(gè)B類型的屬性,那個(gè)容器會(huì)把B注入到A中
image.png
二、AOP ( Aspect oriented Programming)?向切?編程/?向??編程
1、什么是AOP?
- AOP:Aspect oriented Programming ?向切?編程/?向??編程
- AOP是OOP(Object Oriented Programming)的延續(xù),從OOP說起
- OOP三?特征:封裝、繼承和多態(tài)
-
oop是?種垂直繼承體系
image.png
OOP編程思想通過繼承方式可以解決?多數(shù)的代碼重復(fù)問題,但是有?些情況是處理不了的,?如下?的在頂級(jí)?類Animal中的多個(gè)?法中相同位置出現(xiàn)了重復(fù)代碼,OOP就解決不了

橫切邏輯代碼

橫切邏輯代碼存在的問題:
- 橫切代碼大量重復(fù)
- 橫切邏輯代碼和業(yè)務(wù)代碼混雜在?起,代碼臃腫,維護(hù)不?便
由于存在這些問題,AOP出場,AOP獨(dú)辟蹊徑提出橫向抽取機(jī)制,將橫切邏輯代碼和業(yè)務(wù)邏輯代碼分離

代碼拆分容易,那么如何在不改變原有業(yè)務(wù)邏輯的情況下,悄?聲息的把橫切邏輯代碼應(yīng)?到原有的業(yè)務(wù)邏輯中,達(dá)到和原來?樣的效果,這個(gè)是?較難的
2、AOP在解決什么問
在不改變原有業(yè)務(wù)邏輯情況下,增強(qiáng)橫切邏輯代碼,根本上解耦合,避免橫切邏輯代碼重復(fù)
3、為什么叫做?向切?編程
「切」:指的是橫切邏輯,原有業(yè)務(wù)邏輯代碼我們不能動(dòng),只能操作橫切邏輯代碼,所以?向橫切邏輯
「?」:橫切邏輯代碼往往要影響的是很多個(gè)?法,每?個(gè)?法都如同?個(gè)點(diǎn),多個(gè)點(diǎn)構(gòu)成?
對(duì)應(yīng)演示代碼下載地址:https://gitee.com/happymima/java-study-spring-project.git


