Java?Spring的核心與設(shè)計(jì)思想你知道嗎
Spring是什么?
我們通常所說(shuō)的 Spring 指的是 Spring Framework(Spring 框架),它是?個(gè)開(kāi)源框架,有著活躍?龐 ?的社區(qū),這就是它之所以能?久不衰的原因。Spring ?持?泛的應(yīng)?場(chǎng)景,它可以讓 Java 企業(yè)級(jí)的 應(yīng)?程序開(kāi)發(fā)起來(lái)更簡(jiǎn)單。
??句話概括 Spring:Spring 是包含了眾多?具?法的 IoC 容器。
什么是容器?
容器是?來(lái)容納某種物品的(基本)裝置。 ——來(lái)?:百度百科
我們想想,之前課程我們接觸的容器有哪些?
- List/Map -> 數(shù)據(jù)存儲(chǔ)容器
- Tomcat -> Web 容器
什么是IoC?
Spring 也是?個(gè)容器,Spring 是什么容器呢?
Spring 是?個(gè) IoC 容器。
什么是 IoC?
IoC = Inversion of Control 翻譯成中?是“控制反轉(zhuǎn)”的意思,也就是說(shuō) Spring 是?個(gè)“控制反轉(zhuǎn)”的容 器,怎么理解這句話呢,我們先從以下示例開(kāi)始。
傳統(tǒng)程序開(kāi)發(fā)
構(gòu)建?輛?(Car Class
),然??需要依賴?身(FrameWork Class
),??身需要依賴底盤(Bottom Class
),?底盤需要依賴輪胎(Tire Class
),最終程序的實(shí)現(xiàn)代碼如下:
public class NewCarExample { public static void main(String[] args) { Car car = new Car(); car.init(); } /** * 汽?對(duì)象 */ static class Car { public void init() { // 依賴?身 Framework framework = new Framework(); framework.init(); } } /** * ?身類 */ static class Framework { public void init() { // 依賴底盤 Bottom bottom = new Bottom(); bottom.init(); } } /** * 底盤類 */ static class Bottom { public void init() { // 依賴輪胎 Tire tire = new Tire(); tire.init(); } } /** * 輪胎類 */ static class Tire { // 尺? private int size = 30; public void init() { System.out.println("輪胎尺?:" + size); } } }
傳統(tǒng)程序開(kāi)發(fā)的缺陷:
以上程序中,輪胎的尺?的固定的,然?隨著對(duì)的?的需求量越來(lái)越?,個(gè)性化需求也會(huì)越來(lái)越多,這 時(shí)候我們就需要加?多種尺?的輪胎,那這個(gè)時(shí)候就要對(duì)上?的程序進(jìn)?修改了,修改后的代碼如下所 示:
public class NewCarUpdateExample { public static void main(String[] args) { Car car = new Car(20); car.run(); } /** * 汽?對(duì)象 */ static class Car { private Framework framework; public Car(int size) { framework = new Framework(size); } public void run() { // 依賴?身 framework.init(); } } /** * ?身類 */ static class Framework { private Bottom bottom; public Framework(int size) { bottom = new Bottom(size); } public void init() { // 依賴底盤 bottom.init(); } } /** * 底盤類 */ static class Bottom { private Tire tire; public Bottom(int size) { tire = new Tire(size); } public void init() { // 依賴輪胎 tire.init(); } } /** * 輪胎類 */ static class Tire { // 尺? private int size; public Tire(int size) { this.size = size; } public void init() { System.out.println("輪胎尺?:" + size); } } }
從以上代碼可以看出,以上程序的問(wèn)題是:
當(dāng)最底層代碼 改動(dòng)之后,整個(gè)調(diào)?鏈上的所有代碼都需要 修改。
如何解決上述問(wèn)題呢?
解耦指的是解決了 代碼的耦合性,耦合性也可以換?種叫法叫程序相關(guān)性。好的程序代碼的耦合 性(代碼之間的相關(guān)性)是很低的,也就是代碼之間要實(shí)現(xiàn)解耦。
控制反轉(zhuǎn)式程序開(kāi)發(fā)
基于以上思路,我們把調(diào)?汽?的程序示例改造?下,把創(chuàng)建?類的?式,改為注?傳遞的?式,具體 實(shí)現(xiàn)代碼如下:
public class IocCarExample { public static void main(String[] args) { Tire tire = new Tire(20); Bottom bottom = new Bottom(tire); Framework framework = new Framework(bottom); Car car = new Car(framework); car.run(); } static class Car { private Framework framework; public Car(Framework framework) { this.framework = framework; } public void run() { framework.init(); } } static class Framework { private Bottom bottom; public Framework(Bottom bottom) { this.bottom = bottom; } public void init() { bottom.init(); } } static class Bottom { private Tire tire; public Bottom(Tire tire) { this.tire = tire; } public void init() { tire.init(); } } static class Tire { private int size; public Tire(int size) { this.size = size; } public void init() { System.out.println("輪胎:" + size); } } }
代碼經(jīng)過(guò)以上調(diào)整,?論底層類如何變化,整個(gè)調(diào)?鏈?zhǔn)遣?做任何改變的,這樣就完成了代碼之間的 解耦,從?實(shí)現(xiàn)了更加靈活、通?的程序設(shè)計(jì)了。
兩種開(kāi)發(fā)方式對(duì)比總結(jié)
在傳統(tǒng)的代碼中對(duì)象創(chuàng)建順序是:Car
-> Framework
-> Bottom
-> Tire
改進(jìn)之后解耦的代碼的對(duì)象創(chuàng)建順序是:Tire
-> Bottom
-> Framework
-> Car
我們發(fā)現(xiàn)了?個(gè)規(guī)律:
通?程序的實(shí)現(xiàn)代碼,類的創(chuàng)建順序是反的,傳統(tǒng)代碼是 Car 控制并創(chuàng)建了 Framework,F(xiàn)ramework 創(chuàng)建并創(chuàng)建了 Bottom,依次往下
改進(jìn)之后的控制權(quán)發(fā)?的反轉(zhuǎn),不再是 上級(jí)對(duì)象創(chuàng)建并控制下級(jí)對(duì)象了,?是下級(jí)對(duì)象把注?將當(dāng)前對(duì)象中,下級(jí)的控制權(quán)不再由上級(jí)類控制 了,這樣即使下級(jí)類發(fā)?任何改變,當(dāng)前類都是不受影響的
這就是典型的控制反轉(zhuǎn),也就是 IoC 的實(shí) 現(xiàn)思想。
理解SpringIoC
回到我們的主題:Spring,本?剛開(kāi)始咱們就講:Spring 是包含了多個(gè)?具?法的 IoC 容器,這就是 對(duì) Spring 最核?的總結(jié)。“集成多個(gè)?具?法”這事咱們以后慢慢再講,那如何理解“Spring 是?個(gè) IoC 容器”這句話呢?
既然 Spring 是?個(gè) IoC(控制反轉(zhuǎn))容器,重點(diǎn)還在“容器”?字上,那么它就具備兩個(gè)最基礎(chǔ)的功能:
- 將對(duì)象存?到容器;
- 從容器中取出對(duì)象。
也就是說(shuō)學(xué) Spring 最核?的功能,就是學(xué)如何將對(duì)象存?到 Spring 中,再?gòu)?Spring 中獲取對(duì)象的過(guò) 程。
將對(duì)象存放到容器中的好處:將對(duì)象存儲(chǔ)在 IoC 容器相當(dāng)于將以后可能?的所有?具制作好都放到倉(cāng) 庫(kù)中,需要的時(shí)候直接取就?了,?完再把它放回到倉(cāng)庫(kù)。? new 對(duì)象的?式相當(dāng)于,每次需要?具 了,才現(xiàn)做,?完就扔掉了也不會(huì)保存,下次再?的時(shí)候還得重新做,這就是 IoC 容器和普通程序開(kāi) 發(fā)的區(qū)別。
Spring 是?個(gè) IoC 容器,說(shuō)的是對(duì)象的創(chuàng)建和銷毀的權(quán)利都交給 Spring 來(lái)管理了,它本身?具備了存 儲(chǔ)對(duì)象和獲取對(duì)象的能?。
DI 概念說(shuō)明
說(shuō)到 IoC 不得不提的?個(gè)詞就是“DI”,DI 是 Dependency Injection 的縮寫(xiě),翻譯成中?是“依賴注入”的意思。
所謂依賴注?,就是由 IoC 容器在運(yùn)?期間,動(dòng)態(tài)地將某種依賴關(guān)系注?到對(duì)象之中。所以,依 賴注?(DI)和控制反轉(zhuǎn)(IoC)是從不同的?度的描述的同?件事情,就是指通過(guò)引? IoC 容 器,利?依賴關(guān)系注?的?式,實(shí)現(xiàn)對(duì)象之間的解耦。
IoC 是“?標(biāo)”也是?種思想,??標(biāo)和思想只是?種指導(dǎo)原則,最終還是要有可?的落地?案,? DI 就 屬于具體的實(shí)現(xiàn)。
面試問(wèn)題總結(jié)
Spring 是什么?如何理解 Spring?
Spring 是包含了眾多?具?法的 IoC 容器。
Spring 是?個(gè) IoC 容器,說(shuō)的是對(duì)象的創(chuàng)建和銷毀的權(quán)利都交給 Spring 來(lái)管理了,它本身?具備了存 儲(chǔ)對(duì)象和獲取對(duì)象的能?。
IoC 和 DI 是啥?有什么區(qū)別?
IoC是控制反轉(zhuǎn),它是一種設(shè)計(jì)思想;DI控制反轉(zhuǎn),它是一種實(shí)現(xiàn)手段
Spring 最核?的功能是啥?
將對(duì)象存?到 Spring 中,再?gòu)?Spring 中獲取對(duì)象。
對(duì)象的創(chuàng)建和銷毀的權(quán)利都交給 Spring 來(lái)管理了,它本身?具備了存 儲(chǔ)對(duì)象和獲取對(duì)象的能?
總結(jié)
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
關(guān)于Java中的實(shí)體類要?implements?Serializable的原因分析
這篇文章主要介紹了Java中的實(shí)體類為什么要?implements?Serializable,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-06-06Netty + ZooKeeper 實(shí)現(xiàn)簡(jiǎn)單的服務(wù)注冊(cè)與發(fā)現(xiàn)
服務(wù)注冊(cè)和發(fā)現(xiàn)一直是分布式的核心組件。本文介紹了借助 ZooKeeper 做注冊(cè)中心,如何實(shí)現(xiàn)一個(gè)簡(jiǎn)單的服務(wù)注冊(cè)和發(fā)現(xiàn)。,需要的朋友可以參考下2019-06-06mybatis中方法返回泛型與resultType不一致的解決
這篇文章主要介紹了mybatis中方法返回泛型與resultType不一致的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07Java并發(fā)實(shí)例之CyclicBarrier的使用
這篇文章主要介紹了Java并發(fā)實(shí)例之CyclicBarrier的使用,涉及CyclicBarrier的介紹,以及相關(guān)的并發(fā)實(shí)例,具有一定參考價(jià)值,需要的朋友可以了解下。2017-11-11詳解Java的Struts框架以及相關(guān)的MVC設(shè)計(jì)理念
這篇文章主要介紹了詳解Java的Struts框架以及相關(guān)的MVC設(shè)計(jì)理念,Struts是Java的SSH三大web開(kāi)發(fā)框架之一,需要的朋友可以參考下2015-12-12springcloud之自定義簡(jiǎn)易消費(fèi)服務(wù)組件
這篇文章主要介紹了springcloud之自定義簡(jiǎn)易消費(fèi)服務(wù)組件,本篇來(lái)使用rest+ribbon消費(fèi)服務(wù),并且通過(guò)輪詢方式來(lái)自定義了個(gè)簡(jiǎn)易消費(fèi)組件,感興趣的小伙伴們可以參考一下2018-06-06