?哈嘍,哈嘍,大家好~ 我是你們的老朋友:保護(hù)小周???
談起Java 圈子里的框架,最年長最耀眼的莫過于 Spring 框架啦,如今已成為最流行、最廣泛使用的Java開發(fā)框架之一。不知道大家有沒有在使用 Spring 框架的時(shí)候思考過這些問題,什么是框架?Spring 是什么?如何理解 Spring ?? ?loC 和 DI 是什么,有什么區(qū)別? Spring 最核心的功能是啥? 本文將為大家講解,一起來看看叭~
本期收錄于博主的專欄:JavaEE_保護(hù)小周?的博客-CSDN博客
適用于編程初學(xué)者,感興趣的朋友們可以訂閱,查看其它 “JavaEE基礎(chǔ)知識(shí)”。
更多精彩敬請期待:保護(hù)小周? *★,°*:.☆( ̄▽ ̄)/$:*.°★* ‘
一、Spring 是什么?
Spring是一個(gè)開源的Java框架,有著活躍而龐大的社區(qū)(例如:Apache),Spring 提供了一系列的工具和庫,可以幫助開發(fā)者構(gòu)建高效、可靠、易于維護(hù)的企業(yè)級(jí)應(yīng)用程序。Spring的核心模塊包括IOC容器、AOP、ORM等,它還提供了許多擴(kuò)展模塊如Spring MVC、Spring Security、Spring Data等,可以滿足不同場景下的需求。Spring最初由Rod Johnson創(chuàng)建于2002年,如今已成為最流行、最廣泛使用的Java開發(fā)框架之一。
用一句話概括 Spring : 包含了眾多工具方法的 loC 容器。
框架是一種軟件架構(gòu),是一組實(shí)現(xiàn)某種邏輯或功能的代碼和類庫的集合,我們需要按照框架設(shè)計(jì)者的規(guī)則來使用,所以在框架的世界里 :“約定大于配置”
“約定大于配置”(Convention over Configuration)是一種軟件開發(fā)理念,通過使用一些約定過的默認(rèn)設(shè)置和行為,來簡化配置和編碼的過程。在這種理念下,框架依據(jù)事先聲明好的約定、繼續(xù)一些默認(rèn)設(shè)置和命名規(guī)則,自動(dòng)完成一些繁瑣的配置,使開發(fā)人員能夠更快、更容易地構(gòu)建應(yīng)用程序。這樣可以減少冗余代碼以及重復(fù)勞動(dòng),幫助開發(fā)人員更好地專注于應(yīng)用程序的功能開發(fā)。
舉一個(gè)不大恰當(dāng)?shù)睦?/strong>:就像我們使用的庫函數(shù)一樣,我們無需關(guān)注庫函數(shù)的實(shí)現(xiàn),我們關(guān)注的是這些庫函數(shù)的應(yīng)用場景是什么,有什么功能,我們怎么使用,參數(shù)是什么,函數(shù)的參數(shù)以及使用方式,就可以認(rèn)為是函數(shù)與開發(fā)者的約定~
1.1 什么是 loC 容器
“容器” :可以存儲(chǔ)一些東西的 “器物” 就叫做容器,例如水杯。
容器的概念,其實(shí)在JavaSE(語法) 階段就接觸過了,我們的集合類,ArrayLIst , Map ,Set 都是容器,是接納數(shù)據(jù)的容器。
loC (In)Inversion of Control 翻譯成中文就是 “控制反轉(zhuǎn)” 的意思,控制反轉(zhuǎn)一種編程設(shè)計(jì)思想,將程序的控制流程從傳統(tǒng)的主動(dòng)調(diào)用方式轉(zhuǎn)變?yōu)楸粍?dòng)接收方式,從而實(shí)現(xiàn)模塊之間的解耦和依賴管理。
1.1.1 傳統(tǒng)開發(fā)模型
假設(shè),我們站在代碼的角度構(gòu)建一座房子, 設(shè)計(jì)思路:
?構(gòu)建一座房子(House?Class),然而房子需要依賴房屋結(jié)構(gòu)(BuildingFame?Class),而房屋構(gòu)架需要依賴建筑材料(BuildingMaterials Class),而建筑材料需要依賴地基(FoundationClass),最終程序的實(shí)現(xiàn)代碼如下:
//這是一個(gè)房子類
public class House {
//一個(gè)房子需要依賴房屋的架構(gòu)
House() {
System.out.println("這是一個(gè)房子");
}
BuildingFame buildingFame = null;
public void init() {
//依賴于房屋架構(gòu)
System.out.println("執(zhí)行了初始化房屋架構(gòu)的方法");
this.buildingFame = new BuildingFame();
buildingFame.init();
}
}
//房屋構(gòu)架
class BuildingFame {
//房屋的架構(gòu)依賴與建筑材料
BuildingMaterials buildingMaterials = null;
public void init() {
//依賴于建筑材料
System.out.println("執(zhí)行了初始化建筑材料的方法");
this.buildingMaterials = new BuildingMaterials();
buildingMaterials.init();
}
}
//建筑材料
class BuildingMaterials {
//建筑材料依賴于地基
Foundation foundation = null;
public void init() {
//依賴于地基
System.out.println("執(zhí)行了初始化地基的方法");
this.foundation = new Foundation();
foundation.init();
}
}
//地基
class Foundation {
public void init() {
String size = "100m*m";
//依賴于地基
System.out.println("地基:" + size);
}
}
執(zhí)行結(jié)果:?
傳統(tǒng)開發(fā)的缺陷:
以上程序中,房屋地基的大?。ㄆ椒剑┑墓潭ǖ?,隨著對(duì)的房屋的需求量越來越?,個(gè)性化需求也會(huì)越來越多,一個(gè)家庭人口多的可能需要 200 個(gè)平方的房子,對(duì)于新婚的夫妻來說也許 100 個(gè)平方的房子就夠了,這時(shí)候我們針對(duì)房屋地基的大小進(jìn)行處理了,同時(shí)也需要對(duì)上面的程序進(jìn)?修改了,修改后的代碼如下所示:
//這是一個(gè)房子類
public class House {
//一個(gè)房子需要依賴房屋的架構(gòu)
House() {
System.out.println("這是一個(gè)房子");
}
BuildingFame buildingFame = null;
public void init(String size) {
//依賴于房屋架構(gòu)
System.out.println("執(zhí)行了初始化房屋架構(gòu)的方法");
this.buildingFame = new BuildingFame();
buildingFame.init(size);
}
}
//房屋構(gòu)架
class BuildingFame {
//房屋的架構(gòu)依賴與建筑材料
BuildingMaterials buildingMaterials = null;
public void init(String size) {
//依賴于建筑材料
System.out.println("執(zhí)行了初始化建筑材料的方法");
this.buildingMaterials = new BuildingMaterials();
buildingMaterials.init(size);
}
}
//建筑材料
class BuildingMaterials {
//建筑材料依賴于地基
Foundation foundation = null;
public void init(String size) {
//依賴于地基
System.out.println("執(zhí)行了初始化地基的方法");
this.foundation = new Foundation();
foundation.init(size);
}
}
//地基
class Foundation {
String size = "100 m*m";
public void init(String size) {
this.size = size;
//依賴于地基
System.out.println("地基:" + size);
}
}
?
從上訴代碼中可以看出的問題是:當(dāng)最底層的代碼需要改動(dòng)時(shí),整個(gè) House 類調(diào)用鏈上的所有依賴類都需要進(jìn)行修改,而且類于類之間的依賴性極高。
上述程序設(shè)計(jì)存在一定的缺陷,我們該如何解決呢?
1.1.2 loC 控制反轉(zhuǎn)式程序開發(fā)
我們可以嘗試不在每個(gè)類中創(chuàng)建下級(jí)類,如果創(chuàng)建的類出現(xiàn)當(dāng)下級(jí)類發(fā)?改變操作,自己也要跟著修改的這種情況。這個(gè)時(shí)候,我們只需要將原來創(chuàng)建的下級(jí)類,改為傳參的方式(也就是注?的方式),因?yàn)槲覀儾恍枰诋?dāng)前類中創(chuàng)建下級(jí)類了,當(dāng)前類只是向外描述了我需要一個(gè)什么類,所以下級(jí)類即使發(fā)?變化(創(chuàng)建或減少參數(shù)),當(dāng)前類本身也無需修改任何代碼,這樣就完成了程序的解耦。
說到這里兒,就不得不提一下啥是 “解耦”
高內(nèi)聚低耦合(high cohesion and low coupling)是一種軟件設(shè)計(jì)思想,可以有效地提高軟件的可維護(hù)性和靈活性。
高內(nèi)聚:指的是一個(gè)模塊內(nèi)部的元素彼此之間緊密相關(guān),完成一個(gè)特定的、明確的任務(wù),而不與其他外部元素產(chǎn)生過多的交互。
低耦合:指的是模塊之間的相互依賴盡可能地低,模塊之間只是完成部分純粹的任務(wù)時(shí)才會(huì)進(jìn)行互動(dòng),以減少相互影響,提高軟件的靈活性和可擴(kuò)展性。
使用高內(nèi)聚低耦合的原則可以讓軟件系統(tǒng)更加靈活和易于維護(hù)。高內(nèi)聚能夠使得模塊內(nèi)部的邏輯更加清晰明確,每個(gè)模塊都有特定的職責(zé),易于理解和維護(hù);低耦合能夠降低模塊之間的相互依賴,當(dāng)需要修改或重構(gòu)時(shí),減少了對(duì)其他模塊的影響,提高了軟件的可維護(hù)性和可擴(kuò)展性。
基于上述思路,我們把構(gòu)建房屋的程序示例改造?下,把創(chuàng)建子類的方式,改為注入傳遞(傳參)的方式,具體實(shí)現(xiàn)代碼如下:
//這是一個(gè)房子類
public class House {
BuildingFame buildingFame = null;
//一個(gè)房子需要依賴房屋的架構(gòu)
public House(BuildingFame buildingFame) {
this.buildingFame = buildingFame;
System.out.println("這是一個(gè)房子");
}
public void init() {
//依賴于房屋架構(gòu)
System.out.println("執(zhí)行了初始化房屋架構(gòu)的方法");
buildingFame.init();
}
}
//房屋構(gòu)架
class BuildingFame {
//房屋的架構(gòu)依賴與建筑材料
BuildingMaterials buildingMaterials = null;
public BuildingFame(BuildingMaterials buildingMaterials) {
this.buildingMaterials = buildingMaterials;
}
public void init() {
//依賴于建筑材料
System.out.println("執(zhí)行了初始化建筑材料的方法");
buildingMaterials.init();
}
}
//建筑材料
class BuildingMaterials {
//建筑材料依賴于地基
Foundation foundation = null;
public BuildingMaterials(Foundation foundation) {
this.foundation = foundation;
}
public void init() {
//依賴于地基
System.out.println("執(zhí)行了初始化地基的方法");
foundation.init();
}
}
//地基
class Foundation {
String size = "100 m*m";
public Foundation(String size) {
this.size = size;
}
public void init() {
//依賴于地基
System.out.println("地基:" + size);
}
}
?
使用 loC 控制反轉(zhuǎn)思想后, 無論被依賴類如何變化,對(duì)于整個(gè)調(diào)用鏈的影響是微乎其微的,這樣就完成了代碼之間的解耦,提高程序的靈活性和可擴(kuò)展性。
?
小結(jié):
通過以上兩個(gè)實(shí)例,我們可以發(fā)現(xiàn),兩個(gè)實(shí)例類創(chuàng)建的順序是反著的,傳統(tǒng)的代碼 House 控制并創(chuàng)建了 BuildingFame ,? BuildingFame 創(chuàng)建了 BuildingMaterials …… 依次往下創(chuàng)建,使用 loC 控制反轉(zhuǎn)后,不再是上層對(duì)象創(chuàng)建并控制下層對(duì)象,而是把下層對(duì)象注入到當(dāng)前對(duì)象中,這樣下級(jí)類發(fā)生任何改變,也不會(huì)對(duì)當(dāng)前類產(chǎn)生任何影響,這就是 loC 的實(shí)現(xiàn)思想。
1.2 Spring 是一個(gè) loC 容器?
上文講到,用一句話概括 Spring : 包含了多個(gè)工具方法的 loC 容器。博主也通過示例給大家闡述了什么是 loC (控制反轉(zhuǎn))思想。
重點(diǎn)還是在 “容器” 上,既然是一個(gè)容器,那么它就具備兩個(gè)最基礎(chǔ)的功能:
- 將對(duì)象存入容器中;
- 從容器中取出對(duì)象;
這也是?Spring 框架中最核心的功能,就是學(xué)會(huì)如何將對(duì)象存入到 Spring 中,如何從 Spring 中獲取對(duì)象的過程。
將創(chuàng)建好的對(duì)象放在容器中的好處:對(duì)象存儲(chǔ)在 loC 容器中,就好比將工具放在工具箱內(nèi),需要的時(shí)候直接從工具中取就好了,用完工具之后再放回工具箱中,?new 對(duì)象的方式就好比,每次需要使用工具的時(shí)候發(fā)現(xiàn)沒有,只能現(xiàn)場去“買一個(gè)”,用完之后也不保存,下次再需要的時(shí)候還得去“買”,這就是 loC 容器和普通程序開發(fā)的本質(zhì)區(qū)別。
如何將對(duì)象存入到 Spring 中,如何從 Spring 中獲取對(duì)象,將是下一期的核心,盡請期待。
1.3 DI 的概念
提起?loC 設(shè)計(jì)思想,就不得不提到 “DI” (Dependency Injection 的縮寫——“依賴注入”)
“依賴注入” 指的就是由 IoC 容器在運(yùn)行期間(程序運(yùn)行期間),動(dòng)態(tài)地將某種依賴關(guān)系注入到對(duì)象之中。傳統(tǒng)的做法是由程序主動(dòng)去找他所依賴的對(duì)象然后進(jìn)行實(shí)例化,而DI則是由容器主動(dòng)地將依賴關(guān)系注入到對(duì)象中。這樣做的好處是對(duì)象之間解耦,提高了代碼的復(fù)用性和可維護(hù)性。通過DI可以統(tǒng)一控制對(duì)象的生命周期,減少了資源的浪費(fèi)。
站在廣義的角度 loC 與 DI 描述的同一個(gè)東西,站在不同的角度 loC 是一種設(shè)計(jì)思想(控制反轉(zhuǎn))、指導(dǎo)原則,DI 則是 loC 思想的具體實(shí)現(xiàn)——IoC 容器在運(yùn)?期間(程序運(yùn)行期間),動(dòng)態(tài)地將某種依賴關(guān)系注入到對(duì)象之中。
存放在 Spring 中的對(duì)象也被稱之為 “Bean 對(duì)象”。
舉個(gè)例子:我需要房子,
loC :我覺得蓋一座房子需要 先打基地,在去買建筑材料,再把整個(gè)房子構(gòu)架搭起來,裝修慢慢搞,那么這是一種蓋房子設(shè)計(jì)思想以及目的。
DI : 喂喂,張老板我想蓋房子,你派挖掘機(jī)過來幫我挖一下地基,喂喂,李老板,我想蓋房子,你幫我運(yùn)些 沙石,鋼筋混泥土過來…… ,喂喂,王老板,是這樣的,我想蓋個(gè)房子,你安排一下工人幫我蓋房子唄,地基和建筑材料都已經(jīng)到位了,價(jià)錢好商量。DI 是指導(dǎo)思想的具體是實(shí)現(xiàn)。
好了,到這里,【Spring】核心與設(shè)計(jì)思想?博主已經(jīng)分享完了,希望對(duì)大家有所幫助,如有不妥之處歡迎批評(píng)指正。?
?
感謝每一位觀看本篇文章的朋友,更多精彩敬請期待:保護(hù)小周? *★,°*:.☆( ̄▽ ̄)/$:*.°★*?文章來源:http://www.zghlxwxcb.cn/news/detail-477212.html
遇見你,所有的星星都落在我的頭上……?文章來源地址http://www.zghlxwxcb.cn/news/detail-477212.html
到了這里,關(guān)于【Spring】核心與設(shè)計(jì)思想的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!