前言
在整個 Java 生態(tài)中,Spring 具有舉足輕重的地位瑰谜。目前以 JavaEE 作為后端的 Web 開發(fā)幾乎全部采用了 Spring 相關(guān)的技術(shù)。跟 Spring 相關(guān)的字眼有很多,它們都是什么示惊?Spring 為什么這么受歡迎奥溺?
Spring 與它的伙計們
關(guān)于 Spring辞色, 網(wǎng)上有如下幾種定義:
1.Spring Framework 是一個開源的 Java/JavaEE全功能棧(full-stack)的應(yīng)用程序框架。
2.Spring: the source for modern java.
3.Spring 是一個輕量級控制反轉(zhuǎn)(IoC)和面向切面(AOP)的容器框架浮定。
如今 Spring 已走過了十七八個年頭相满,其含義也逐漸發(fā)生了變化。畢竟不是寫書桦卒,關(guān)于它的歷史沿革這里就不贅述了立美。
目前而言,Spring 是用于構(gòu)建 Java 應(yīng)用的一套工具的集合方灾,包括 Spring Framework建蹄、Spring Boot、Spring Cloud、Spring Cloud Data Flow 四個部分洞慎。
一针贬、各個部分的關(guān)系
這里需要借用官網(wǎng)的幾張圖。
第一張圖拢蛋,如何完成你的 App桦他?你可以用 Spring Boot 搭建一切,用 Spring Cloud 協(xié)調(diào)一切谆棱,用 Spring Cloud Data Flow 連接一切快压。
第二張圖是 Spring Framework 5 的兩套技術(shù)棧,分別針對 Reactive 和 Servlet 風(fēng)格開發(fā)垃瞧∧枇樱可以看出,Spring Boot 處于技術(shù)棧的頂層个从,是 Spring Framework 的一部分脉幢。
過去使用 Spring,需要手動配置許多內(nèi)容嗦锐,而有了 Spring Boot嫌松,我們可以快速地搭建出基于 Spring 的開發(fā)環(huán)境,包括 Web 服務(wù)器以及大量常用的第三方庫的配置奕污,從而節(jié)省開發(fā)者的精力萎羔。
Spring Boot 也可以稱為一個框架,但它并不實現(xiàn) Spring MVC 的功能碳默,它們是不同層次的東西贾陷。也就是說,在業(yè)務(wù)方面嘱根,使用 Spring Boot 與否并不會產(chǎn)生太大改變髓废。
最后我們把各種名字含 Spring 的東西的關(guān)系捋一捋。
Spring Framework该抒,也就是我們通常所說的 Spring慌洪,包含 Spring Boot、Spring MVC 等一系列內(nèi)容柔逼,指的是一個完整的技術(shù)棧蒋譬。
Spring MVC,是基于 Spring 的 MVC 框架愉适,包含了 Spring 的功能核心犯助。
Spring Boot,是一個用于快速開發(fā)的搭建工具(腳手架)维咸,使用它搭建出來的項目可以稱為是使用了 Spring Boot 框架剂买。
Spring Cloud 惠爽,是一個基于 Spring Boot 實現(xiàn)的云應(yīng)用開發(fā)工具。
Spring Cloud Data Flow 瞬哼,也可以說是基于 Spring Boot 的工具婚肆,用于簡化專注于數(shù)據(jù)處理用例的應(yīng)用程序的開發(fā)和部署。
二坐慰、Spring 基礎(chǔ):IoC 與 AOP
Spring 的核心思想较性,即實現(xiàn)控制反轉(zhuǎn)(Inversion of Control)與面向切面編程(Aspect Oriented Programming)
什么是 IoC?
通常來講结胀,我們要在 class A
中使用 class B
的對象赞咙,需要顯式地去 new
一個。比如
public class A {
B b = new B(arg1, arg2);
}
如果 class B
發(fā)生了改變糟港,那么相應(yīng)地也需要修改 class A
的代碼攀操。在一個項目中,各個類之間的依賴關(guān)系可能十分復(fù)雜秸抚,層層相扣速和,也就是說,具有很高的 “耦合度”剥汤。
IoC 是解決這個問題的一種方法颠放,即把對象的創(chuàng)建交給一個外界的實體(也就是 Spring 的配置文件)。這樣秀姐,在我們修改了 class B
后慈迈,只需要相應(yīng)地修改配置文件若贮,就不用再管別的地方了省有。
舉個例子,假設(shè) class A
是啃的雞的顧客谴麦,class B
是炸雞蠢沿,當(dāng)顧客要吃炸雞時,只需要喊一嗓子:“Spring(啃的雞店員)匾效,給我來塊炸雞舷蟀!”就好了,炸雞的做法再怎么變面哼,也跟顧客沒有關(guān)系野宜。
實現(xiàn)控制反轉(zhuǎn)的方式主要是 DI(Dependency Injection,依賴注入)魔策,即在創(chuàng)建 class A
的對象 a
時把所需要 class B
的對象 b
注入到 a
對應(yīng)的屬性中匈子。還有一種方式叫“依賴查找”(Dependency Lookup),這里不再贅述闯袒。
什么是 AOP虎敦?
切面游岳,是一種新的模塊化機(jī)制,用來描述分散在對象其徙、類或函數(shù)中的橫切關(guān)注點胚迫。 面向切面編程,是通過預(yù)編譯方式和運(yùn)行期動態(tài)代理實現(xiàn)程序功能的統(tǒng)一維護(hù)的一種技術(shù)唾那。
上面的內(nèi)容用人話來說访锻,就是我們在項目開發(fā)中,應(yīng)該把核心業(yè)務(wù)功能(登錄闹获、CRUD 等)與周邊功能(性能統(tǒng)計朗若、日志、事務(wù)管理等)區(qū)分開昌罩。而 Spring 通過種種機(jī)制實現(xiàn)了這個要求哭懈,非常非常好非常非常棒。
假設(shè)我們需要在每執(zhí)行一步業(yè)務(wù)邏輯前后均輸出日志(如下圖茎用,出自 How2J.cn)遣总,就可以利用 AOP 的思想,把功能的執(zhí)行順序?qū)懺谂渲梦募泄旃Γ@樣業(yè)務(wù)邏輯和日志功能的代碼就可以分離開旭斥。可以說古涧,面向切面編程是一種粒度更大的面向?qū)ο缶幊獭?/p>
三垂券、Spring MVC
Spring MVC 即基于 Spring 的 MVC 框架,也是目前最為流行的 MVC 框架羡滑,沒有之一菇爪。
當(dāng)然,使用 Spring 也不一定就要使用 Spring MVC柒昏,也可以使用 Structs 等框架凳宙。然而目前 SSH(Spring + Structs + Hibernate) 框架已經(jīng)顯出頹勢了,新的應(yīng)用更多地選用 SSM(Spring + Spring MVC + Mybatis) 框架開發(fā)职祷。
Spring MVC 的核心概念氏涩,一個是 Spring,一個是 MVC有梆,這些都已經(jīng)講過了是尖,這里不再贅述。在使用它前需要經(jīng)過一些配置泥耀,百度一下即可饺汹。
關(guān)于 MVC,可以參考我的文章 —— 「JavaEE 極簡教程(四):MVC 模式」 爆袍。
下一篇我們將探討當(dāng)下如何選擇框架首繁,請看——
「JavaEE 極簡教程(六):框架的選擇」