Java?Spring的核心與設計思想你知道嗎
Spring是什么?
我們通常所說的 Spring 指的是 Spring Framework(Spring 框架),它是?個開源框架,有著活躍?龐 ?的社區(qū),這就是它之所以能?久不衰的原因。Spring ?持?泛的應?場景,它可以讓 Java 企業(yè)級的 應?程序開發(fā)起來更簡單。
??句話概括 Spring:Spring 是包含了眾多?具?法的 IoC 容器。
什么是容器?
容器是?來容納某種物品的(基本)裝置。 ——來?:百度百科
我們想想,之前課程我們接觸的容器有哪些?
- List/Map -> 數據存儲容器
- Tomcat -> Web 容器
什么是IoC?
Spring 也是?個容器,Spring 是什么容器呢?
Spring 是?個 IoC 容器。
什么是 IoC?
IoC = Inversion of Control 翻譯成中?是“控制反轉”的意思,也就是說 Spring 是?個“控制反轉”的容 器,怎么理解這句話呢,我們先從以下示例開始。
傳統程序開發(fā)

構建?輛?(Car Class),然??需要依賴?身(FrameWork Class),??身需要依賴底盤(Bottom Class),?底盤需要依賴輪胎(Tire Class),最終程序的實現代碼如下:
public class NewCarExample {
public static void main(String[] args) {
Car car = new Car();
car.init();
}
/**
* 汽?對象
*/
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);
}
}
}
傳統程序開發(fā)的缺陷:
以上程序中,輪胎的尺?的固定的,然?隨著對的?的需求量越來越?,個性化需求也會越來越多,這 時候我們就需要加?多種尺?的輪胎,那這個時候就要對上?的程序進?修改了,修改后的代碼如下所 示:
public class NewCarUpdateExample {
public static void main(String[] args) {
Car car = new Car(20);
car.run();
}
/**
* 汽?對象
*/
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);
}
}
}
從以上代碼可以看出,以上程序的問題是:
當最底層代碼 改動之后,整個調?鏈上的所有代碼都需要 修改。
如何解決上述問題呢?
解耦指的是解決了 代碼的耦合性,耦合性也可以換?種叫法叫程序相關性。好的程序代碼的耦合 性(代碼之間的相關性)是很低的,也就是代碼之間要實現解耦。
控制反轉式程序開發(fā)
基于以上思路,我們把調?汽?的程序示例改造?下,把創(chuàng)建?類的?式,改為注?傳遞的?式,具體 實現代碼如下:
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);
}
}
}
代碼經過以上調整,?論底層類如何變化,整個調?鏈是不?做任何改變的,這樣就完成了代碼之間的 解耦,從?實現了更加靈活、通?的程序設計了。
兩種開發(fā)方式對比總結
在傳統的代碼中對象創(chuàng)建順序是:Car -> Framework -> Bottom -> Tire
改進之后解耦的代碼的對象創(chuàng)建順序是:Tire -> Bottom -> Framework -> Car

我們發(fā)現了?個規(guī)律:
通?程序的實現代碼,類的創(chuàng)建順序是反的,傳統代碼是 Car 控制并創(chuàng)建了 Framework,Framework 創(chuàng)建并創(chuàng)建了 Bottom,依次往下
改進之后的控制權發(fā)?的反轉,不再是 上級對象創(chuàng)建并控制下級對象了,?是下級對象把注?將當前對象中,下級的控制權不再由上級類控制 了,這樣即使下級類發(fā)?任何改變,當前類都是不受影響的
這就是典型的控制反轉,也就是 IoC 的實 現思想。
理解SpringIoC
回到我們的主題:Spring,本?剛開始咱們就講:Spring 是包含了多個?具?法的 IoC 容器,這就是 對 Spring 最核?的總結。“集成多個?具?法”這事咱們以后慢慢再講,那如何理解“Spring 是?個 IoC 容器”這句話呢?
既然 Spring 是?個 IoC(控制反轉)容器,重點還在“容器”?字上,那么它就具備兩個最基礎的功能:
- 將對象存?到容器;
- 從容器中取出對象。
也就是說學 Spring 最核?的功能,就是學如何將對象存?到 Spring 中,再從 Spring 中獲取對象的過 程。
將對象存放到容器中的好處:將對象存儲在 IoC 容器相當于將以后可能?的所有?具制作好都放到倉 庫中,需要的時候直接取就?了,?完再把它放回到倉庫。? new 對象的?式相當于,每次需要?具 了,才現做,?完就扔掉了也不會保存,下次再?的時候還得重新做,這就是 IoC 容器和普通程序開 發(fā)的區(qū)別。
Spring 是?個 IoC 容器,說的是對象的創(chuàng)建和銷毀的權利都交給 Spring 來管理了,它本身?具備了存 儲對象和獲取對象的能?。
DI 概念說明
說到 IoC 不得不提的?個詞就是“DI”,DI 是 Dependency Injection 的縮寫,翻譯成中?是“依賴注入”的意思。
所謂依賴注?,就是由 IoC 容器在運?期間,動態(tài)地將某種依賴關系注?到對象之中。所以,依 賴注?(DI)和控制反轉(IoC)是從不同的?度的描述的同?件事情,就是指通過引? IoC 容 器,利?依賴關系注?的?式,實現對象之間的解耦。

IoC 是“?標”也是?種思想,??標和思想只是?種指導原則,最終還是要有可?的落地?案,? DI 就 屬于具體的實現。
面試問題總結
Spring 是什么?如何理解 Spring?
Spring 是包含了眾多?具?法的 IoC 容器。
Spring 是?個 IoC 容器,說的是對象的創(chuàng)建和銷毀的權利都交給 Spring 來管理了,它本身?具備了存 儲對象和獲取對象的能?。
IoC 和 DI 是啥?有什么區(qū)別?
IoC是控制反轉,它是一種設計思想;DI控制反轉,它是一種實現手段
Spring 最核?的功能是啥?
將對象存?到 Spring 中,再從 Spring 中獲取對象。
對象的創(chuàng)建和銷毀的權利都交給 Spring 來管理了,它本身?具備了存 儲對象和獲取對象的能?
總結
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關注腳本之家的更多內容!
相關文章
Spring中Bean有關NullPointerException異常的原因分析
在Spring中使用@Autowired注解注入的bean不能在靜態(tài)上下文中訪問,否則會導致NullPointerException,解決方法包括避免在靜態(tài)方法中使用注入的bean,或者使用Spring的ApplicationContext來獲取bean,但后者不推薦2024-12-12
Spring Boot中配置文件application.properties使用
這篇文章主要介紹了Spring Boot中配置文件application.properties使用及spring boot讀取application.properties文件的方式,需要的朋友參考下吧2018-01-01
springBoot+webMagic實現網站爬蟲的實例代碼
這篇文章主要介紹了springBoot+webMagic實現網站爬蟲的實例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-05-05

