Spring 已經佔領了主要的 Java 開發者的市場,但從2017年 RightScale 發佈的調查報告來看, Spring Boot 使用趨勢是在穩定上升的階段。
Spring Boot 是什麼?
對於傳統的 Spring 開發者來說,即使開發一個簡單的功能,也需要進行大量的配置聲明,以及大量繁瑣的註解。
為了化繁為簡,Spring Boot 主要解決了以下問題:
Spring Boot 提供極其快速和簡化的操作,讓 Spring 開發者快速上手。
提供了 Spring 運行的默認配置。(約定優於配置)。
為通用 Spring 項目提供了很多非功能性特性,例如:嵌入式 Server,Security,統計,健康檢查,外部配置等等。
Spring Boot 包含幾個部分,Auto-configuration、Starters、Cli、Actuator 等等。本文主要介紹 Spring Boot 的常用註解,加載原理,環境變量配置以及 Actuator。
Spring Boot 註解
@SpringBootApplication 註解是 Spring Boot 開發者遇到的第一個註解。由於很多 Spring 的開發者經常在 Main 方法裡聲明 @Configuration, @EnableAutoConfiguration and @ComponentScan. 所以 Sping Boot 提供了這個便捷的註解: @SpringBootApplication,它的作用等同於前面三個註解,它會加載一些列默認的類,也會默認打開 Spring MVC 的註解(@EnableWebMvc)。
@ConditionOnClass(A.class) 表示在某種調節下,這個@Configuration 才會被加載,這裡的條件是 A.class 在 ClassPath 之上。
Spring Boot 啟動流程
ApplicationStartedEvent 被觸發。
日誌服務被初始化。
ApplicationEnvironmentPreparedEvent 被觸發。
讀取 Config 文件。你可以為 Spring 項目配置多個 Profile,例如為開發環境配置 Application-dev.properties,此時Spring 會讀取你指定的 Profile 進行加載。
調用 EnvironmentPostProcessor 裡的內容。
日誌初始化完成。
ApplicationPreparedEvent 被觸發。
ApplicationContext 被刷新。
ContextRefreshedEvent 被觸發。
嵌入式 Server 連接池開啟,接受 HTTP 請求。在啟動 Server 之前必須保證 Application Context 的內容處於最新的狀態。
EmbeddedServletContainerInitializedEvent 事件被觸發。
ApplicationReadyEvent 事件被觸發。
如果你想捕獲這些事情,可以通過實現這些事件的監聽器(EventListener),來捕獲這些事件進行處理,所以這一整套 Spring Boot 的啟動流程是可以擴展定製化的。
Spring Boot 配置環境變量適應不同運行環境
應用需要被部署到不同的環境進行測試和發佈,環境的配置不同,怎麼辦?一個 Cloud Native 的應用需要具備適應不同環境的能力,也就是說,代碼和配置必須分離,所有與環境相關的變量應該在程序運行時被注入,而不是打包在 war/jar 包裡。
Spring boot 提供了 EnvironmentPostProcessor 接口來支持你為 Spring 應用注入不同的環境變量。你可以通過實現這個接口,來指定環境變量注入的來源,例如文件,或者雲環境裡的變量,例如獲取 Cloud Foundry 應用運行時環境變量裡的數據庫連接池信息,ZooKeeper 地址等等。
Spring Boot Actuator
在 Pom 文件中添加 spring-boot-starter-actuator 依賴即可使用 Actuator:
Actuator 為我們提供了非常豐富的 Endpoint,包括:/env、/info、/metrics、/health 等。通過這些 EndPoint,我們可以快速瀏覽應用的環境變量,健康狀態,等等。
不僅如此,Actuator 查看運行時使用的環境變量時還會它會將環境變量的敏感值做脫敏處理,默認任何包含 TOKEN 和 Password 的變量都會顯示為*號,你可以自行聲明一些敏感字段。這些功能對於生產環境的問題排除,故障預警都非常有幫助。
總結
Spring Boot 並不是要成為 Spring IO 平臺裡面眾多基礎項目的替代者,而是為平臺帶來另一種開發體驗,從而簡化對這些已有技術的使用。對於已經熟悉 Spring 生態系統的開發人員來說,Spring Boot 是一個很理想的選擇,對於採用 Spring 技術的新人來說,Spring Boot 提供一種更簡潔的方式來使用這些技術。
閱讀更多 Java高級開發工程師 的文章