1,Spring是什么?
我們通常所說的Spring
指的是 Spring Framework
(Spring 框架),它是一個(gè)輕量級(jí)的 Java 開源框架,有著活躍龐?的社區(qū)。Spring 是為了解決企業(yè)應(yīng)用開發(fā)的復(fù)雜性而創(chuàng)建的,不僅?持?泛的應(yīng)?場(chǎng)景,還讓 Java 企業(yè)級(jí)的應(yīng)?程序開發(fā)更加簡(jiǎn)單。
如何簡(jiǎn)單地使??句話概括 Spring:Spring 是包含了眾多工具方法的 IoC 容器。
上述這句話中的有兩個(gè)重點(diǎn),其一是包含眾多工具方法,其二是IoC容器。
工具方法我們不難理解,但是IoC容器是什么?而對(duì)于IoC容器這個(gè)問題,我們將其劃分為兩個(gè)子問題,何為IoC?何為容器?
1.1,何為容器?
容器是用來容納某種物品的(基本)裝置。 ——來自:百度百科
在日常生活中,容器隨處可見。例如,我們使用的水杯就是容器,其是用來容納水的裝置;書架也是容器,其是用來容納書本的裝置 …
而在編程中,容器也隨處可見。例如,我們使用的整型數(shù)組是容器,其是用來存放整型數(shù)據(jù)的裝置;map也是容器,其是用來存放鍵值對(duì)的裝置 …
Spring 也是?個(gè)容器,那 Spring 是什么容器呢? Spring 是?個(gè) IoC 容器。
1.2,何為IoC?
IoC 是Inversion of Control
的縮寫,翻譯成中?是控制反轉(zhuǎn)的意思,也就是說 Spring 是?個(gè)控制反轉(zhuǎn)的容器。
那如何理解這控制反轉(zhuǎn)呢?我們從下面這個(gè)示例進(jìn)行理解。
示例前提:構(gòu)建?輛車(Car Class),然而車需要依賴車身(FrameWork Class),而車身需要依賴底盤(Bottom Class),而底盤需要依賴輪胎(Tire Class),輪胎尺寸規(guī)定為17
實(shí)現(xiàn)上述示例,有兩種方式,分別為傳統(tǒng)程序開發(fā)和控制反轉(zhuǎn)式程序開發(fā)。
1)傳統(tǒng)式程序開發(fā)
傳統(tǒng)程序開發(fā)的原理是在每個(gè)當(dāng)前類中創(chuàng)建下級(jí)類,從而實(shí)現(xiàn)類與類之間的依賴關(guān)系。
傳統(tǒng)程序開發(fā)–>最終程序的實(shí)現(xiàn)代碼如下:
1,Car(車)類
public class Car {
private Framework framework;
public Car(){
framework = new Framework();
}
public void init(){
System.out.println("do car ...");
framework.init();
}
}
2,F(xiàn)ramework(車身)類
public class Framework {
private Bottom bottom;
public Framework(){
bottom = new Bottom();
}
public void init(){
System.out.println("do framework ...");
bottom.init();
}
}
3,Bottom(底盤)類
public class Bottom {
private Tire tire;
public Bottom(){
tire = new Tire();
}
public void init(){
System.out.println("do bottom ...");
tire.init();
}
}
4,Tire(輪胎)類
public class Tire {
private int size = 17;
public Tire(){
}
public void init(){
System.out.println("do tire >> size = " + size);
}
}
5,Test(測(cè)試)類
public class Test {
public static void main(String[] args) {
Car car = new Car();
car.init();
}
}
6,測(cè)試運(yùn)行結(jié)果
2)控制反轉(zhuǎn)式程序開發(fā)
控制反轉(zhuǎn)式程序開發(fā)的原理是將在每個(gè)當(dāng)前類中創(chuàng)建下級(jí)類改為在當(dāng)前類中傳遞注入下級(jí)類,從而實(shí)現(xiàn)類與類之間的依賴關(guān)系。
控制反轉(zhuǎn)式程序開發(fā)–>最終程序的實(shí)現(xiàn)代碼如下:
1,Car(車)類
public class Car {
private Framework framework;
public Car(Framework framework){
this.framework = framework;
}
public void init(){
System.out.println("do car ...");
framework.init();
}
}
2,F(xiàn)ramework(車身)類
public class Framework {
private Bottom bottom;
public Framework(Bottom bottom){
this.bottom = bottom;
}
public void init(){
System.out.println("do framework ...");
bottom.init();
}
}
3,Bottom(底盤)類
public class Bottom {
private Tire tire;
public Bottom(Tire tire){
this.tire = tire;
}
public void init(){
System.out.println("do bottom ...");
tire.init();
}
}
4,Tire(輪胎)類
public class Tire {
private int size = 17;
public Tire(){
}
public void init(){
System.out.println("do tire ... >> size = " + size);
}
}
5,Test(測(cè)試)類
public class Test {
public static void main(String[] args) {
Tire tire = new Tire();
Bottom bottom = new Bottom(tire);
Framework framework = new Framework(bottom);
Car car = new Car(framework);
car.init();
}
}
6,測(cè)試運(yùn)行結(jié)果
3)傳統(tǒng)式程序開發(fā)缺陷
在上述程序中,輪胎尺?的固定的,然而隨著對(duì)的車的需求量越來越?,個(gè)性化需求也會(huì)越來越多,這時(shí)候我們就需要加工多種尺寸的輪胎。那這時(shí)就需要對(duì)上述程序代碼進(jìn)行更改,修改后代碼如下:
1,Car(車)類
public class Car {
private Framework framework;
public Car(int size){
framework = new Framework(size);
}
public void init(){
System.out.println("do car ...");
framework.init();
}
}
2,F(xiàn)ramework(車身)類
public class Framework {
private Bottom bottom;
public Framework(int size){
bottom = new Bottom(size);
}
public void init(){
System.out.println("do framework ...");
bottom.init();
}
}
3,Bottom(底盤)類
public class Bottom {
private Tire tire;
public Bottom(int size){
tire = new Tire(size);
}
public void init(){
System.out.println("do bottom ...");
tire.init();
}
}
4,Tire(輪胎)類
public class Tire {
private int size = 17;
public Tire(int size){
this.size = size;
}
public void init(){
System.out.println("do tire >> size = " + size);
}
}
5,Test(測(cè)試)類
public class Test {
public static void main(String[] args) {
Car car = new Car(20);
car.init();
}
}
6,測(cè)試運(yùn)行結(jié)果
根據(jù)上述修改后的代碼不難看出,傳統(tǒng)式程序開發(fā)存在的問題是:當(dāng)最底層類改動(dòng)之后,整個(gè)調(diào)用鏈上的所有代碼都需要經(jīng)過修改。
而控制反轉(zhuǎn)式程序開發(fā)就可以很好地解決上述這個(gè)問題,?論底層類如何改動(dòng)和變化,整個(gè)調(diào)用鏈?zhǔn)遣挥米鋈魏胃淖兊摹?/strong>
4)開發(fā)方式對(duì)比總結(jié)
傳統(tǒng)式程序開發(fā)中的對(duì)象創(chuàng)建順序是:Car -> Framework -> Bottom -> Tire
控制反轉(zhuǎn)式程序開發(fā)中的對(duì)象創(chuàng)建順序是:Tire -> Bottom -> Framework -> Car
兩種方式的對(duì)比效果圖:
從上面的對(duì)比中,不難看出:程序開發(fā)的實(shí)現(xiàn)代碼,類的創(chuàng)建順序是相反的。
傳統(tǒng)式程序開發(fā)的實(shí)現(xiàn)代碼是 Car 控制并創(chuàng)建了Framework,F(xiàn)ramework 創(chuàng)建并創(chuàng)建了 Bottom,依次往下。
而控制反轉(zhuǎn)式程序開發(fā)的控制權(quán)發(fā)生了反轉(zhuǎn),不再是上級(jí)對(duì)象創(chuàng)建并控制下級(jí)對(duì)象,而是把下級(jí)對(duì)象注?當(dāng)前對(duì)象中,這時(shí)下級(jí)的控制權(quán)不再由上級(jí)類控制。這樣無論下級(jí)類發(fā)?何種改變,當(dāng)前類都是不受影響的,這就是典型的控制反轉(zhuǎn),也就是 IoC 的實(shí)現(xiàn)思想。
5)IoC歸納總結(jié)
從上面這個(gè)示例中,我們知道了什么是控制反轉(zhuǎn),以及其的實(shí)現(xiàn)思想。
IoC是一種思想,而不是一種技術(shù),它的實(shí)現(xiàn)思想是將下級(jí)對(duì)象通過傳遞的方式注入到當(dāng)前類當(dāng)中,從而實(shí)現(xiàn)控制權(quán)的反轉(zhuǎn)。
IoC這種思想實(shí)現(xiàn)了解耦合的功能,減少模塊之間的依賴性,提高程序的獨(dú)立性,極大地降低了程序代碼的維護(hù)和調(diào)試難度。
耦合性也可被稱為程序相關(guān)性,一個(gè)好的程序代碼的耦合性(代碼之間的相關(guān)性)是很低的,也就是說程序之間的依賴性比較弱。
IoC控制反轉(zhuǎn)的深層理解:
在傳統(tǒng)式程序開發(fā)中,我們直接在對(duì)象內(nèi)部通過new方式進(jìn)行創(chuàng)建對(duì)象,是程序主動(dòng)創(chuàng)建并直接獲取依賴對(duì)象,對(duì)象是主動(dòng)地接收依賴對(duì)象,這也就是正轉(zhuǎn)。
而在控制反轉(zhuǎn)式程序開發(fā)中,IoC是有專門一個(gè)容器來創(chuàng)建并存儲(chǔ)這些對(duì)象,也就是使用Ioc容器來控制對(duì)象的創(chuàng)建存儲(chǔ),并且?guī)臀覀儾檎液妥⑷胍蕾噷?duì)象,對(duì)象是被動(dòng)的接受依賴對(duì)象,這也就是反轉(zhuǎn)。
2,Spring IoC 的理解
理解清楚了什么是容器?以及什么是IoC?這兩個(gè)問題,那接下來我們就接著往下講講如何理解Spring是一個(gè)IoC容器這句話呢?
IoC容器具備的最基本的兩個(gè)功能為:將對(duì)象存儲(chǔ)到容器中,從容器中取出對(duì)象。
也就是說學(xué) Spring 最核心的功能,就是學(xué)如何將對(duì)象存入到 Spring 中,再從 Spring 中獲取對(duì)象的過程。
IoC是通過IoC容器把對(duì)象的創(chuàng)建和調(diào)用過程交給Spring進(jìn)行管理,省去了使用 “new 類名” 的方式創(chuàng)建對(duì)象的步驟。
歸納:Spring 是?個(gè) IoC 容器,說的是對(duì)象的創(chuàng)建和銷毀的權(quán)利都交給 Spring 來管理了,它本身又具備了存儲(chǔ)對(duì)象和獲取對(duì)象的能力。
歸納:控制反轉(zhuǎn)式程序開發(fā)和傳統(tǒng)式程序開發(fā)的區(qū)別:
控制反轉(zhuǎn)式程序開發(fā)是將以后操作可能使用到的所有工具類創(chuàng)建好并存儲(chǔ)到IoC容器中,需要的時(shí)候直接從IoC容器中獲取,使用完后放回到IoC容器中;而傳統(tǒng)式程序開發(fā)是在每次需要的時(shí)候直接創(chuàng)建并使用,使用完后直接舍棄不進(jìn)行保存,下次使用時(shí)需重新創(chuàng)建和調(diào)用。
由此可歸納出Spring IoC 的優(yōu)點(diǎn):
- 解耦合,減少類與類之間的依賴性,提高程序的獨(dú)立性,降低了程序代碼的維護(hù)難度。
- 使用更加方便,不需要再手動(dòng)創(chuàng)建對(duì)象,也不需要關(guān)注這個(gè)對(duì)象背后的依賴關(guān)系。
- 效率更加高效,需要使用時(shí)直接從IoC容器中獲取,使用后放回IoC容器,不需要每次使用時(shí)都重新創(chuàng)建。
3,DI 是什么?
DI 是Dependency Injection
的縮寫,翻譯成中文是依賴注入的意思。
所謂依賴注入,就是 IoC 容器在運(yùn)行期間,動(dòng)態(tài)地將某種依賴關(guān)系注入到對(duì)象之中的行為。
依賴注入(DI)和控制反轉(zhuǎn)(IoC)是從不同的角度來描述同?件事情。
而這件事情就是指通過引入 IoC 容器,利用依賴關(guān)系注入的方式,實(shí)現(xiàn)對(duì)象之間的解耦。
loC是一種思想目標(biāo),屬于指導(dǎo)原則,要想實(shí)現(xiàn)該思想目標(biāo),最終還是要有可行的落地方案,而DI就屬于具體的實(shí)現(xiàn)方式。
核心總結(jié)
1,Spring 是什么?如何理解 Spring?
解答:Spring是個(gè)流行的框架,用一句話概括Spring,Spring是包含眾多方法工具的IoC容器。他有兩大功能:將對(duì)象存儲(chǔ)到容器中以及從容器中獲取對(duì)象。
2,IoC 和 DI 是啥?有什么區(qū)別?
解答:IoC是Inversion of Control
的縮寫,譯為控制反轉(zhuǎn),DI是Dependency Injection
的縮寫,譯為依賴注入,兩者是從不同的角度來描述同?件事情。兩者區(qū)別為IoC是一種思想,而DI是IoC的一種具體實(shí)現(xiàn),是動(dòng)態(tài)將某種依賴注入到對(duì)象的行為。
3,Spring 最核心的功能是啥?
解答:Spring最核心的部分是IoC容器, 學(xué)Spring最核心的功能,就是學(xué)如何將對(duì)象存入到 Spring 中,再從 Spring 中獲取對(duì)象的過程。
結(jié)語
這就是本期博客的全部?jī)?nèi)容啦!如果有什么其他的問題無法自己解決,可以在評(píng)論區(qū)留言哦!
最后,如果你覺得這篇文章寫的還不錯(cuò)的話或者有所收獲的話,麻煩小伙伴們動(dòng)動(dòng)你們的小手,給個(gè)三連唄(點(diǎn)贊??,評(píng)論?,收藏??),多多支持一下!各位的支持是我最大的動(dòng)力,后期不斷更新優(yōu)質(zhì)的內(nèi)容來幫助大家,一起進(jìn)步。那我們下期見!文章來源:http://www.zghlxwxcb.cn/news/detail-541004.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-541004.html
到了這里,關(guān)于【JavaEE進(jìn)階】Spring核心與設(shè)計(jì)思想的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!