一、Spring是什么?
我們一般所說(shuō)的Spring指的是Spring Framework(Spring 框架),它是一個(gè)開(kāi)源的框架,Spring支持廣泛的應(yīng)用場(chǎng)景,它可以讓Java企業(yè)級(jí)的應(yīng)用程序開(kāi)發(fā)變得更簡(jiǎn)單,官方一點(diǎn)的回答:spring是J2EE應(yīng)用程序框架,是輕量級(jí)的IoC和AOP的容器框架,主要是針對(duì)javaBean的生命周期進(jìn)行管理的輕量級(jí)容器,可以單獨(dú)使用,也可以和Struts框架,mybatis框架等組合使用。
上述是官方的回答,可以用一句話概括Spring:Spring是包含眾多工具方法的IoC容器
二、什么是IoC容器?
容器是什么?
容器是可以用來(lái)存取某種物品的裝置,我們之前學(xué)過(guò)一些容器:List/Stack/Map(數(shù)據(jù)存儲(chǔ)容器),Tomcat(Web容器)
什么是IOC?
Spring也是一個(gè)容器,那么Spring是什么容器呢? Spring是一個(gè)IoC容器 ,那么我們首先得弄清楚什么是IoC了?
IoC(Inversion of Control):IoC是一種思想,控制反轉(zhuǎn),也就是說(shuō)Spring是一個(gè)控制反轉(zhuǎn)的容器。
比如我們的A依賴B,于是我們需要在A中去new B對(duì)象,此時(shí)我們的A控制著B的生命周期,也可以說(shuō)A控制著B,這樣的耦合性過(guò)高,IoC的思想就是將這個(gè)控制權(quán)交給其他人,至于其他人是誰(shuí)我不管,當(dāng)我需要B時(shí)傳給我即可。
我們現(xiàn)在有這樣一個(gè)需求,構(gòu)建一輛車(Car),而車依賴于車身(FrameWork),車身需要依賴地盤(Bottom),地盤需要依賴于輪胎(Tire)
這樣的代碼有什么問(wèn)題呢? 層層依賴,上述程序中我們輪轂大小是寫死的,如果我需要加工不同的輪轂,我們不僅需要對(duì)Tire進(jìn)行修改,因?yàn)锽ottom依賴Tire所以Bootom也需要修改,F(xiàn)rameWork依賴于Bootom所以FrameWork也需要修改,Car依賴于FrameWork所以Car也需要修改。
我們可以看出來(lái),這種模式的代碼當(dāng)最底層的代碼改動(dòng)之后,整個(gè)調(diào)用鏈上的所有代碼都需要修改。
我們只需要將原來(lái)由自己創(chuàng)建下級(jí)類,改為傳遞的方式(注入),因?yàn)槲覀儾恍枰约喝?chuàng)建下級(jí)類了,所以即使下級(jí)類發(fā)生了變化,當(dāng)前類也不需要修改,這樣程序就能進(jìn)行解耦
代碼經(jīng)過(guò)以上調(diào)整,無(wú)論底層類如何變化,整個(gè)調(diào)用鏈?zhǔn)遣挥米鋈魏胃淖兊模@樣就完成了代碼之間的解耦,從而實(shí)現(xiàn)了更加靈活、通用的程序設(shè)計(jì)了。
傳統(tǒng)與改進(jìn)之間的對(duì)比:
在傳統(tǒng)的代碼中對(duì)象創(chuàng)建順序是:Car -> Framework -> Bottom -> Tire
改進(jìn)之后解耦的代碼的對(duì)象創(chuàng)建順序是:Tire -> Bottom -> Framework -> Car
我們可以發(fā)現(xiàn),傳統(tǒng)的代碼類創(chuàng)建順序是反著的,Car控制FrameWork,F(xiàn)rameWork控制著Bottom,Bottom控制著Tire。而改進(jìn)之后的控制器發(fā)生了反轉(zhuǎn),是下層將對(duì)象注入到當(dāng)前類中,下級(jí)的控制權(quán)不再由上級(jí)控制了,下級(jí)在發(fā)生改變時(shí)上次時(shí)不受影響的,這就是IoC的實(shí)現(xiàn)思想
Spring IoC
Spring是一個(gè)包含眾多工具方法的IoC容器,它具備兩個(gè)最基礎(chǔ)的功能:
1.將對(duì)象存入到容器(將對(duì)象存入到Spring)
2.從容器中取出對(duì)象(從Spring中獲取對(duì)象)
將對(duì)象存放到容器有什么好處呢?
將容易存儲(chǔ)到IoC容器相當(dāng)于我們將所有可能用到的工具制作好都放到倉(cāng)庫(kù),當(dāng)我們需要時(shí)直接取即可,用完歸還倉(cāng)庫(kù)。new對(duì)象的方式相當(dāng)于我們每次需要用工具的時(shí)候現(xiàn)場(chǎng)制作,制作完了扔掉,下次需要的時(shí)候重新做。
Spring是一個(gè)IoC容器,說(shuō)的是對(duì)象的創(chuàng)建和銷毀的權(quán)力都交給了Spring來(lái)管理,本身又具有存儲(chǔ)對(duì)象和獲取對(duì)象的能力
優(yōu)點(diǎn):
1.解耦
2.使用更加方便(不用手動(dòng)去new和關(guān)注對(duì)象的依賴關(guān)系)
3.更加高效
三、DI
DI(Dependency Injection):依賴注入,IoC運(yùn)行期間,動(dòng)態(tài)的將關(guān)系注入到對(duì)象之中。
傳統(tǒng)方式(手動(dòng)new):
依賴注入:
這里大家還沒(méi)有學(xué)注解不用關(guān)系,只需要知道是IoC容器主動(dòng)將依賴B注入到對(duì)象A中。
IoC(控制反轉(zhuǎn)) 和 DI(依賴注入)是從不同的角度去描述同一件事情,IoC是一種思想,而DI是具體的實(shí)現(xiàn)技術(shù)
總結(jié)
Spring是什么?
Spring是包含眾多工具方法的IoC容器
Spring最核心的功能是什么?
Spring既然是一個(gè)IoC容器,那么它有兩個(gè)主要的功能:
1.將Bean對(duì)象存儲(chǔ)到Spring容器
2.從Spring容器中獲取Bean對(duì)象
IoC和DI是什么?有什么區(qū)別?
Ioc(Inversion of Control),把創(chuàng)建對(duì)象的權(quán)利交給容器,對(duì)象的實(shí)例不再由調(diào)用者來(lái)創(chuàng)建,而是由容器來(lái)創(chuàng)建,容器會(huì)負(fù)責(zé)控制程序之間的關(guān)系,而不是由調(diào)用者的程序代碼直接控制。這樣,控制權(quán)由應(yīng)用代碼轉(zhuǎn)移帶了容器,控制權(quán)發(fā)生了反轉(zhuǎn),這就是控制反轉(zhuǎn)。它是spring框架的核心思想之一。
DI(Dependency Injection),當(dāng)某個(gè)java 實(shí)例需要另一個(gè)java實(shí)例時(shí),創(chuàng)建被調(diào)用者的工作不是由調(diào)用者實(shí)現(xiàn),而是由spring容器來(lái)完成,然后注入調(diào)用者,因此稱為依賴注入。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-414622.html
區(qū)別:
IoC(控制反轉(zhuǎn)) 和 DI(依賴注入)是從不同的角度去描述同一件事情,IoC是一種思想,而DI是具體的實(shí)現(xiàn)技術(shù)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-414622.html
到了這里,關(guān)于Spring框架核心與設(shè)計(jì)思想的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!