在本文中,我不會告訴您如何使用我的代碼在 5 分鐘內啟動並運行一個有效的 Spring 項目。 我只會寫一些基礎知識——你可能不知道的東西,但仍然可以創建一個項目。但在本文中,您仍然不會理解發生了什麼,更重要的是,為什麼會這樣。
如您所見,Spring 是模塊化的。這讓我們只連接我們的應用程序需要的模塊,而不連接那些我們顯然不會使用的模塊。據我所知,正是這種方法讓 Spring 超越了當時的競爭對手(EJB)並取得了領先。使用EJB 的應用程序在它們後面拖了很多依賴項,結果它們變得遲緩和緩慢。 如圖所示,Spring Framework由幾個模塊組成:
什麼是 Spring 框架?
Spring Framework,或簡稱為 Spring,是使用 Java 創建 Web 應用程序的最流行的框架之一。框架就像一個圖書館(也許您對這個術語更熟悉),但有一些事情需要考慮。粗略地說,當你使用一個庫時,你只是創建它包含的類的實例,調用你需要的方法,從而得到你需要的結果。換句話說,這是一種更命令式的方法:在你的程序中,你明確指出你需要創建哪個對象的特定時刻,何時調用哪個特定方法等。對於框架,情況略有不同。您只需編寫自己的一些類並在其中編寫一些邏輯,然後框架本身會創建您的類的實例並調用它們的方法。您的類通常從框架實現一些接口或繼承它的一些類,從而為您提供一些已經為您編寫的功能。但情況並非總是如此。例如,Spring 盡可能地避免這種緊耦合(您的類直接依賴於框架中的類/接口)。它使用註釋來實現這一點。我們稍後再談這個。但重要的是要了解 Spring 只是可供您使用的類和接口的集合 :) 我還想立即說明 Spring 不僅可以用於 Web 應用程序,還可以用於最常見的控制台程序我們大家都很熟悉。我們甚至會在今天寫其中的一篇。從而為您提供一些已經為您編寫的功能。但情況並非總是如此。例如,Spring 盡可能地避免這種緊耦合(您的類直接依賴於框架中的類/接口)。它使用註釋來實現這一點。我們稍後再談這個。但重要的是要了解 Spring 只是可供您使用的類和接口的集合 :) 我還想立即說明 Spring 不僅可以用於 Web 應用程序,還可以用於最常見的控制台程序我們大家都很熟悉。我們甚至會在今天寫其中的一篇。從而為您提供一些已經為您編寫的功能。但情況並非總是如此。例如,Spring 盡可能地避免這種緊耦合(您的類直接依賴於框架中的類/接口)。它使用註釋來實現這一點。我們稍後再談這個。但重要的是要了解 Spring 只是可供您使用的類和接口的集合 :) 我還想立即說明 Spring 不僅可以用於 Web 應用程序,還可以用於最常見的控制台程序我們大家都很熟悉。我們甚至會在今天寫其中的一篇。Spring 盡可能地避免這種緊耦合(你的類直接依賴於框架中的類/接口)。它使用註釋來實現這一點。我們稍後再談這個。但重要的是要了解 Spring 只是可供您使用的類和接口的集合 :) 我還想立即說明 Spring 不僅可以用於 Web 應用程序,還可以用於最常見的控制台程序我們大家都很熟悉。我們甚至會在今天寫其中的一篇。Spring 盡可能地避免這種緊耦合(你的類直接依賴於框架中的類/接口)。它使用註釋來實現這一點。我們稍後再談這個。但重要的是要了解 Spring 只是可供您使用的類和接口的集合 :) 我還想立即說明 Spring 不僅可以用於 Web 應用程序,還可以用於最常見的控制台程序我們大家都很熟悉。我們甚至會在今天寫其中的一篇。) 我還想立即指出,Spring 不僅可以用於 Web 應用程序,還可以用於我們所有人都非常熟悉的最常見的控制台程序。我們甚至會在今天寫其中的一篇。) 我還想立即指出,Spring 不僅可以用於 Web 應用程序,還可以用於我們所有人都非常熟悉的最常見的控制台程序。我們甚至會在今天寫其中的一篇。結構
但 Spring 不僅僅是一個特定的框架。相反,它是一個通用名稱,用於指代幾個小框架,每個小框架都有自己的工作。https://docs.spring.io/spring/docs/4.3.26.RELEASE/spring-framework-reference/htmlsingle/
圖 2.1。Spring 框架概述
- 數據訪問
- 網絡
- 核
- 和更多
為什麼 Java 有 Spring 框架?
好吧,除了它時尚、圓滑、新鮮之外,我現在可以說,只要你掌握了一點 Spring 的使用技巧,你就會明白有各種各樣的工作是你不再有的要做,以及 Spring 自己承擔了多少工作。您可以編寫幾十行配置設置並編寫幾個類,最終得到一個可以運行的項目。但是一旦你開始想知道有多少東西在幕後,有多少工作要做,如果你要基於普通的 servlets 或套接字和純 Java 實現同一個項目,你需要編寫多少代碼,你的頭髮會豎起來:) 春天甚至被描述為一種魔法。當你看到一切正常時,你就會體驗到這一點,但您也對幕後發生的工作方式和工作量有一個粗略的了解 — 因此似乎確實存在某種魔法在起作用 :) 稱其為魔法比試圖解釋它們如何相互關聯要容易得多。:) 支持學習 Spring 的第二個論據是,大約 90% 的初級開發人員職位空缺(根據我的個人觀察)需要了解或至少對 Spring 的內容有一個大概的了解Data
, Web MVC
, 和Security
模塊提供老練的開發人員 :) 但今天只是關於基礎知識。
直接投資/控制權
如果您曾經嘗試閱讀有關 Spring 的內容,那麼您首先遇到的可能是這些縮寫詞:DI/IoC。現在我強烈建議您從這篇文章中休息一下,閱讀這篇 DZone 文章! IoC代表控制反轉。當我寫到使用庫需要您自己在代碼中指示調用哪個對象的哪個方法時,我已經順便提到了這一點,但是使用框架通常意味著框架將在正確的時間調用您的代碼。換句話說,在後一種情況下,您不再管理執行代碼/程序的過程——框架會為您做這件事。您將控制權傳遞給了框架(控制反轉)。 DI代表依賴注入. 使用依賴注入,您不需要在 main 方法中創建 cat 對象,然後將它們傳遞給您的方法。相反,Spring Framework 會為您創建它們。您只需說“我想在這裡養一隻貓”之類的話,框架就會在您的方法中將一隻貓傳遞給您。我們將在以後的文章中看到這個縮寫。Bean 和上下文
Spring 中的一個關鍵概念是 bean。實際上,這只是某個類的一個對象。假設我們有一個程序需要 3 個對象:一隻貓、一隻狗和一隻鸚鵡。我們有一堆帶有一堆方法的類。有時我們需要一隻貓來實現一種方法,有時我們需要一隻狗來實現不同的方法,有時我們的方法既需要貓又需要鸚鵡(例如,餵貓的方法,哈哈)。對於其他方法,需要所有三個對象。是的,我們可以先在main方法中創建這三個對象,然後將它們傳遞給我們的類,再在這些類內部傳遞給相關的方法……等等貫穿整個程序。但是如果我們還假設我們偶爾想要更改我們方法的輸入參數列表(例如,我們決定重寫一些東西或添加新功能),那麼我們將不得不對代碼進行相當多的更改。現在想像一下,我們有 300 個這樣的對象,而不是 3 個。一種替代方法是將我們所有的對象收集在一個列表中(List<Object>
), 將它傳遞給每個方法,然後在方法內部獲取必要的對象。但是隨著程序的運行,如果某個對像被添加到這個列表中,或者更糟的是,如果一個對像被刪除了怎麼辦?這有可能破壞我們使用索引從列表中獲取對象的所有方法。為了避免這個問題,我們決定不將對象存儲在列表中,而是存儲在映射中,其中鍵是對象的名稱,值是對象本身。這允許我們簡單地通過使用它們的名稱來檢索我們需要的對象,例如 get("parrot"),作為響應,我們得到鸚鵡對象。或者鍵可以是對象的類,值可以是對象本身。在這種情況下,與其指定對象的名稱,不如指定我們需要的對象的類。那也方便。或者我們甚至可以為映射編寫某種包裝器,其中一些方法通過名稱獲取對象,而其他方法通過類獲取對象。我們到達這裡的東西叫做Spring 框架中的應用上下文。上下文是 bean(對象)的集合。我們通過名稱、類型或其他方式訪問上下文以獲取所需的 bean(對象)。此外,我們可以要求 Spring 本身在自己的上下文中查找我們需要的 bean,並將其傳遞給我們的方法。例如,假設我們有這樣一個方法:
public void doSomething(Cat cat) {
...
}
當 Spring 調用這個方法時,它從它的上下文中取出我們的 cat 對象並將它傳遞給這個方法。但現在我們決定,除了貓,我們的方法還需要一隻鸚鵡。有了 Spring,沒有什麼比這更容易了!我們簡單地寫:
public void doSomething(Cat cat, Parrot parrot) {
...
}
現在當 Spring 調用我們的方法時,它知道需要傳遞一隻貓和一隻鸚鵡,所以它會進入它的上下文,獲取這兩個對象,並將它們傳遞給我們的方法。通過將控制權轉移給 Spring,我們也轉移了創建對象並將它們傳遞給我們的方法的責任,Spring 將調用這些方法。這就引出了一個問題:Spring 如何知道要創建哪些對象(bean)?
配置應用程序的方法
配置應用程序主要有三種方式,即告訴Spring我們需要哪些對象的方式:- XML 配置文件
- 基於 Java 的配置
- 自動配置
- 優先級最高的方法,應該優先使用,是自動配置
- 如果不能使用自動配置來正確配置所有可能的 bean,請使用基於 Java 的配置(涉及使用 Java 代碼創建對象)
- 最低優先級的方法是老式的方法——使用 XML 配置文件。
GO TO FULL VERSION