1. spring 是什麼?
在學習了解,springboot之前,我們需要先了解下spring的前世今生。
Spring誕生時是Java企業版(Java Enterprise Edition,JEE,也稱J2EE)的輕量級代替品。無需開發重量級的Enterprise JavaBean(EJB),Spring為企業級Java開發提供了一種相對簡單的方法,通過依賴注入和面向切面程式設計,用簡單的Java對象(Plain Old Java Object,POJO)實作了EJB的功能。
雖然Spring的元件代碼是輕量級的,但它的配置卻是重量級的。一開始,Spring用XML配置,而且是很多XML配置。Spring 2.5引入了基于注解的元件掃描,這消除了大量針對應用程式自身元件的顯式XML配置。Spring 3.0引入了基于Java的配置,這是一種類型安全的可重構配置方式,可以代替XML。
盡管如此,我們依舊沒能逃脫配置的魔爪。開啟某些Spring特性時,比如事務管理和SpringMVC,還是需要用XML或Java進行顯式配置。啟用第三方庫時也需要顯式配置,比如基于Thymeleaf的Web視圖。配置Servlet和過濾器(比如Spring的DispatcherServlet )同樣需要在web.xml或Servlet初始化代碼裡進行顯式配置。元件掃描減少了配置量,Java配置讓它看上去簡潔不少,但Spring還是需要不少配置。所有這些配置都代表了開發時的損耗。因為在思考Spring特性配置和解決業務問題之間需要進行思維切換,是以寫配置擠占了寫應用程式邏輯的時間。和所有架構一樣,Spring實用,但與此同時它要求的回報也不少。
除此之外,項目的依賴管理也是件吃力不讨好的事情。決定項目裡要用哪些庫就已經夠讓人頭痛的了,你還要知道這些庫的哪個版本和其他庫不會有沖突,這難題實在太棘手。并且,依賴管理也是一種損耗,添加依賴不是寫應用程式代碼。一旦選錯了依賴的版本,随之而來的不相容問題毫無疑問會是生産力殺手。
Spring Boot讓這一切成為了過去。
2. springboot 如何改變spring應用程式開發的
Spring Boot将很多magic帶入了Spring應用程式的開發之中,其中最重要的是以下四個核心。
- 自動配置:針對很多Spring應用程式常見的應用功能,Spring Boot能自動提供相關配置。
- 起步依賴:告訴Spring Boot需要什麼功能,它就能引入需要的庫。
- 指令行界面:這是Spring Boot的可選特性,借此你隻需寫代碼就能完成完整的應用程式,無需傳統項目建構。
- Actuator:讓你能夠深入運作中的Spring Boot應用程式,一探究竟。每一個特性都在通過自己的方式簡化Spring應用程式的開發。本書會探尋如何将它們發揮到極緻,但就目前而言,先簡單看看它們都提供了哪些功能吧。
1.自動配置
在任何的spring應用程式的源碼裡面,你都會找java配置或者XML配置(或者二者兼有)使用它們為應用程式開啟特定的功能。配置看起來也許是這樣的:
@Bean
public DataSource dataSource() {
return new EmbeddedDatabaseBuilder()
.setType(EmbeddedDatabaseType.H2)
.addScripts('schema.sql', 'data.sql')
.build();
}
這個Bean配置方法建立了一個嵌入式資料庫,并指定在該資料庫上執行兩段SQL腳本。 build()方法傳回了一個指向該資料庫的引用。
這個配置不複雜但是除此之外無數個spring程式有着完全相同的方法,可以這樣了解這就是一個樣闆配置。
但是Spring Boot會為這些常見配置場景進行自動配置。如果Spring Boot在應用程式的Classpath裡發現H2資料庫的庫,那麼它就自動配置一個嵌入式H2資料庫。如果在Classpath裡發現JdbcTemplate ,那麼它還會為你配置一個 JdbcTemplate 的Bean。你無需操心那些Bean的配置,Spring Boot會做好準備,随時都能将其注入到你的Bean裡。
2.起步依賴
向項目中添加依賴是件富有挑戰的事。你需要什麼庫?它的Group和Artifact是什麼?你需要
哪個版本?哪個版本不會和項目中的其他依賴發生沖突?
Spring Boot通過起步依賴為項目的依賴管理提供幫助。起步依賴其實就是特殊的Maven依賴和Gradle依賴,利用了傳遞依賴解析,把常用庫聚合在一起,組成了幾個為特定功能而定制的依賴。
舉個例子,假設你正在用Spring MVC構造一個REST API,并将JSON(JavaScript Object
Notation)作為資源表述。此外,你還想運用遵循JSR-303規範的聲明式校驗,并使用嵌入式的Tomcat伺服器來提供服務。要實作以上目标,你在Maven或Gradle裡至少需要以下8個依賴:
- org.springframework:spring-core
- org.springframework:spring-web
- org.springframework:spring-webmvc
- com.fasterxml.jackson.core:jackson-databind
- org.hibernate:hibernate-validator
- org.apache.tomcat.embed:tomcat-embed-core
- org.apache.tomcat.embed:tomcat-embed-el
- org.apache.tomcat.embed:tomcat-embed-logging-juli
不過,如果打算利用Spring Boot的起步依賴,你隻需添加Spring Boot的Web起步依賴
( org.springframework.boot:spring-boot-starter-web ),僅此一個。它會根據依賴
傳遞把其他所需依賴引入項目裡,你都不用考慮它們。
比起減少依賴數量,起步依賴還引入了一些微妙的變化。向項目中添加了Web起步依賴,實際上指定了應用程式所需的一類功能。因為應用是個Web應用程式,是以加入了Web起步依賴。與之類似,如果應用程式要用到JPA持久化,那麼就可以加入jpa起步依賴。如果需要安全功能,那就加入security起步依賴。簡而言之,你不再需要考慮支援某種功能要用什麼庫了,引入相關起步依賴就行。
此外,Spring Boot的起步依賴還把你從“需要這些庫的哪些版本”這個問題裡解放了出來。起步依賴引入的庫的版本都是經過測試的,是以你可以完全放心,它們之間不會出現不相容的情況。
3.指令行界面
除了自動配置和起步依賴,Spring Boot還提供了一種很有意思的新方法,可以快速開發Spring應用程式,Spring Boot CLI讓隻寫代碼即可實作應用程式成為可能。
CLI能檢測到你使用了哪些類,它知道要向Classpath中添加哪些起步依賴才能讓它運轉起來。一旦那些依賴出現在Classpath中,一系列自動配置就會接踵而來,確定啟用DispatcherServlet 和Spring MVC,這樣控制器就能響應HTTP請求了。
Spring Boot CLI是Spring Boot的非必要組成部分。雖然它為Spring帶來了驚人的力量,大大簡化了開發,但也引入了一套不太正常的開發模型。要是這種開發模型與你的口味相去甚遠,那也沒關系,抛開CLI,你還是可以利用Spring Boot提供的其他東西.
4.Actuator
Spring Boot的最後一塊“拼圖”是Actuator,其他幾個部分旨在簡化Spring開發,而Actuator則要提供在運作時檢視應用程式内部情況的能力。安裝了Actuator就能窺探應用程式的内部情況了,包括如下細節:
- Spring應用程式上下文裡配置的Bean
- Spring Boot的自動配置做的決策
- 應用程式取到的環境變量、系統屬性、配置屬性和指令行參數
- 應用程式裡線程的目前狀态
- 應用程式最近處理過的HTTP請求的追蹤情況
- 各種和記憶體用量、垃圾回收、Web請求以及資料源用量相關的名額
Actuator通過Web端點和shell界面向外界提供資訊。如果要借助shell界面,你可以打開SSH(Secure Shell),登入運作中的應用程式,發送指令檢視它的情況。
簡而言之,從本質上來說,Spring Boot就是Spring,它做了那些沒有它你自己也會去做的SpringBean配置。謝天謝地,幸好有Springboot,你不用再寫這些樣闆配置了,可以專注于應用程式的邏輯,這些才是應用程式獨一無二的東西。