Spring Boot從零入門2_核心模塊詳述和開發環境搭建

本文屬於原創,轉載註明出處,歡迎關注微信小程序小白AI博客 微信公衆號小白AI或者網站 https://xiaobaiai.nethtml

[TOC]java

1 前言

在上一篇文章中咱們已經詳解介紹了Spring boot相關的概念、特性以及周邊知識,這一篇文章咱們繼續深刻。咱們知道Spring boot是一個入口,利用Spring Boot提供的核心組件能夠很方便的、快速的(Boot)建立或配置實際項目,接下來咱們來了解Spring boot都包含了哪些核心模塊(組件),以及Spring boot是如何運轉起來的,最後經過一個實際的Hello World項目來講明。git

2 名詞術語

名詞術語 釋義
CLI 命令行界面,command-line interface
Marven Apache Maven是一個軟件項目管理和綜合工具,構建自動化系統(如Make,CMake)。基於項目對象模型(POM)的概念,Maven能夠從一箇中心資料片管理項目構建,報告和文件。Maven簡化和標準化項目建設過程,處理編譯,分配,文檔,團隊協做和其餘任務的無縫鏈接。 Maven增長可重用性並負責創建相關的任務;Marven擁有依賴管理功能,它經過簡單的配置就能夠自動從網絡上下載項目所需的依賴
POM 項目對象模型(Project Object Model),它是Maven項目中的文件,使用XML表示,名稱叫作pom.xml;該文件用於管理:源代碼、配置文件、開發者的信息和角色、問題追蹤系統、組織信息、項目受權、項目的url、項目的依賴關係等;Maven世界中,project能夠什麼都沒有,甚至沒有代碼,可是必須包含pom.xml文件
Gradle Gradle是一個徹底開源的構建自動化系統,使用特定編程語言Groovy來書寫配置文件,不一樣於Marven使用XML。如Android開發IDE Android Studio默認就是使用Gradle來構建項目;Gradle與Maven相比更爲靈活,簡單。
Groovy Groovy是一種基於JVM(Java虛擬機)的敏捷開發語言,最終會編譯成JVM字節碼,它是一種動態編程語言,便可以面向對象編程,也能夠用做純粹的腳本語言,它結合了Python、Ruby和Smalltalk的許多強大的特性,Groovy 代碼可以與 Java 代碼很好地結合,也能用於擴展示有代碼。因爲其運行在 JVM 上的特性,Groovy也可使用其餘非Java語言編寫的庫。像 Kotlin, Scala也都是工做在JVM之上的;語法跟Java語法特別類似;Apache2.0受權;不像Java,全部依賴包是默認導入的;
Spring IoC容器 它是Spring框架的核心。IoC容器從XML文件,Java註解或Java代碼接收元數據。容器經過讀取提供的配置元數據,從簡單的普通Java對象(Plain Old Java Objects, POJO)獲取有關要實例化,配置和組裝哪些對象的指令。這些經過此過程建立的對象稱爲Spring Beans。
JDK8 JDK8或者JDK1.8是因爲自從JDK1.5/JDK5命名方式改變後遺留的新舊命令方式問題。因此JDK8或者JDK1.8也是同一個東西。
STS Spring Tool Suite

3 Spring Boot核心模塊

Spring Boot主要幾個核心模塊:github

  • spring-boot(主模塊),提供了支持Spring Boot其餘部分的功能
  • spring-boot-starters(起步依賴)
  • spring-boot-autoconfigure(自動配置)
  • spring-boot-cli(命令行界面)
  • spring-boot-actuator(執行器)
  • spring-boot-actuator-autoconfigure
  • spring-boot-test
  • spring-boot-loader
  • spring-boot-devtools
  • ......

3.1 spring-boot(主模塊)

💡 下面的操做看不懂或者理解很模糊,先別慌,後面會深刻講解的。由於我如今本身也沒完全搞懂,怕帶歪大家,都是摘取官方文檔中彙總而來的。web

1) SpringApplication 類:spring

  • 該模塊其中的SpringApplication類可用於從Java main方法引導和啓動Spring應用程序。默認狀況下,該class將執行如下步驟來引導應用程序:
    • 建立一個適當的ApplicationContext實例(取決於你的類路徑)
    • 註冊一個CommandLinePropertySource以將命令行參數公開爲Spring的屬性(properties)
    • 刷新應用程序上下文(ApplicationContext),加載全部單例bean
    • 觸發任何CommandLineRunnerbean

在大多數狀況下,能夠直接從主方法中調用靜態run(Class, String [])方法來引導應用程序:數據庫

@Configuration
@EnableAutoConfiguration
public class MyApplication  {

    // ... Bean definitions

    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}複製代碼

對於更高級的配置,能夠在運行以前建立和定製SpringApplication實例:apache

public static void main(String[] args) {
    SpringApplication application = new SpringApplication(MyApplication.class);
    // ... customize application settings here
    application.run(args)
 }複製代碼

SpringApplications能夠從各類不一樣的來源讀取beans。一般建議使用單個@Configuration類來引導你的應用程序,可是,你也能夠從如下位置設置來源:編程

  • 要由AnnotatedBeanDefinitionReader加載的徹底限定的類名
  • XmlBeanDefinitionReader加載的XML資源的位置,或GroovyBeanDefinitionReader加載的groovy腳本
  • 要由ClassPathBeanDefinitionScanner掃描的軟件包的名稱

配置屬性(Configuration properties)也綁定到SpringApplication。這樣就能夠動態設置SpringApplication屬性,例如用於指示Web環境的標記(" spring.main.web-application-type=none")或其餘來源("spring.main.sources" -a CSV list)。標誌以關閉banner("spring.main.banner-mode=off")。小程序

2) 提供嵌入式Web應用程序,使用可選擇容器(Tomcat,Jetty或Undertow)

3) 一流的外部化配置支持

4) 方便的ApplicationContext初始化程序,包括對合理的日誌記錄默認值的支持

總之, 就是spring-boot模塊對應用程序的初始化、配置、啓動以及提供可選WEB運行容器有着很好的支持。

3.2 spring-boot-starters(起步依賴)

Spring Boot StartersSpring Boot Framework的主要關鍵功能或組件之一。Spring Boot Starter的主要職責是將一組常見或相關的依賴項組合爲單個依賴項,從而能夠自動化導入所有依賴。

例如,咱們想用Tomcat WebServer開發一個Spring WebApplication。而後,咱們須要在Mavenpom.xml文件或Gradlebuild.gradle文件中添加如下最小jar依賴項

  • Spring core Jar file(spring-core-xx.jar)
  • Spring Web Jar file(spring-web-xx.jar)
  • Spring Web MVC Jar file(spring-webmvc-xx.jar)
  • Servlet Jar file(servlet-xx.jar)

若是還須要添加一些數據庫內容,則須要添加與數據庫相關的jar,例如Spring JDBC jar文件,Spring ORM jar文件,Spring Transaction Jar文件等。

  • Spring JDBC Jar file(spring-jdbc-xx.jar)
  • Spring ORM Jar file(spring-orm-xx.jar)
  • Spring Transaction Jar file(spring-transaction-xx.jar)

最後,咱們須要在構建文件中定義不少依賴項,對於開發人員而言,這是很是繁瑣且繁瑣的任務,並且它還會增長咱們的構建文件大小。有什麼解決方案能夠避免在構建文件中出現如此多的依賴項定義?解決方案是Spring Boot Starter組件。Spring Boot Starter組件將全部相關的jar組合到單個jar文件中,所以咱們只須要將jar文件依賴項添加到咱們的構建文件中。無需將上述這麼多個jar文件添加到咱們的構建文件中,咱們在Spring boot中利用Spring Boot Starter特性,須要添加一個而且僅添加一個jar文件:spring-boot-starter-web jar文件就能夠了。當咱們將spring-boot-starter-web jar文件依賴項添加到咱們的構建文件中時,Spring Boot Framework將自動下載全部必需的jar並添加到咱們的項目類路徑中,以下圖所示。

總結下來,sping-boot-staters的主要優勢就是:

  • 減小了許多依賴的定義,簡化了項目構建的依賴
  • 簡化了項目構建的依賴關係

3.3 spring-boot-autoconfigure(自動配置)

在沒有Spring Boot出來以前,好比使用Spring MVC框架開發應用須要大量配置,XML各類配置,註解滿天飛(我沒親身經歷過,不過特地去查了下,確實),到了Spring boot這裏如何解決,那就是spring-boot-autoconfigurator模塊了。它主要職責是減小Spring配置。若是咱們在Spring Boot中開發Spring應用程序,那麼咱們就不須要定義單個XML配置,而幾乎不須要或只需不多的Annotation(註解)配置。Spring Boot AutoConfigurator組件將負責提供這些信息。

舉個例子,若是咱們在項目構建文件中使用"spring-boot-starter-web" jar文件,則Spring Boot AutoConfigurator將自動解析視圖(views),視圖解析器(view resolvers)等。並且,Spring Boot減小了註釋配置的定義。若是咱們在類級別使用@SpringBootApplication註釋,那麼Spring Boot AutoConfigurator自動將全部必需的註釋添加到Java類ByteCode中。

若是咱們閱讀Spring Boot Documentation,咱們能夠爲@SpringBootApplication找到如下定義。

@Target(value=TYPE)
@Retention(value=RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters={@ComponentScan.Filter(type=CUSTOM,classes=TypeExcludeFilter.class),})
@ConfigurationPropertiesScan
public @interface SpringBootApplication複製代碼

也就是說,@SpringBootApplication = @Configuration + @ComponentScan + @EnableAutoConfiration

簡而言之,

  • Spring Boot Starter減小了構建的依賴性,而Spring Boot AutoConfigurator減小了Spring配置。
  • 正如咱們所討論的,Spring Boot Starter依賴於Spring Boot AutoConfiguratorSpring Boot Starter自動觸發Spring Boot AutoConfigurator

3.4 Spring Boot CLI(命令行界面)

Spring Boot CLI(命令行界面)是一種Spring Boot軟件,用於從命令提示符下運行和測試Spring Boot應用程序。Spring命令行應用程序能夠編譯並運行Groovy源代碼(採用"spring"命令),這使得編寫絕對的最少代碼以使應用程序運行變得很是容易。Spring CLI還能夠監視文件,並在文件更改時自動從新編譯並從新啓動。

spring 命令行示例:

spring run HelloWorld.groovy複製代碼

具體的Spring Boot CLI工具怎麼安裝和使用,下面咱們會具體討論。

3.5 spring-boot-actuator(執行器)

Spring Boot Actuator有不少功能,可是主要的功能就是:

  • 對應用程序進行健康檢查(health check-up),審覈(auditing),指標收集(metrics gathering)和監控,全部這些功能均可以經過JMX或HTTP端點進行訪問。
  • Spring Boot Actuator提供了執行器端點所需的基礎架構。它包含對執行器端點的註釋支持。開箱即用。
  • 此模塊提供許多端點,包括HealthEndpointEnvironmentEndpointBeansEndpoint等。

當咱們使用CLI運行Spring Boot Web應用程序時,Spring Boot Actuator會自動提供主機名"localhost"和默認端口號"8080"。咱們可使用"http://localhost:8080 /"端點訪問此應用程序。可是咱們實際上使用HTTP請求方法(例如GET和POST)來使用Spring Boot Actuator表示管理端點。後面咱們再來詳細瞭解Actuator吧。

💡上面大概知道了核心模塊都能幹些啥,不過具體細節的,咱們在實際工程中再來體會,除了上述核心模塊,另外有Spring Initilizr Web工具來快速配置生成一個Spring Boot項目。

4 Spring Boot減小依賴、配置的內部原理

瞭解Spring boot是如何減小依賴和配置的原理,這是有必定必要的。瞭解Spring Boot如何減小構建的依賴關係,Spring Configuration等,Spring Boot是如何在後臺運行的。

若是熟悉Groovy編程語言的話,那麼你會了解大多數內容。在Groovy中,咱們不須要添加一些導入,也不須要在Groovy項目中添加一些依賴項。當咱們使用Groovy Compiler(groovyc)編譯Groovy腳本時,它將自動添加全部默認導入語句,而後對其進行編譯。一樣,Groovy編程語言包含一個JAR依賴關係解析器,用於解析全部必需的jar文件並將其添加到Groovy Project類路徑。Spring Boot在內部使用Groovy添加一些默認值,例如Default import語句,Application main()方法等。當咱們從CLI命令提示符運行Groovy腳本時,它使用此main()方法運行Spring Boot Application

Grape是嵌入式依賴關係解決方案引擎。Grape是嵌入Groovy的JAR依賴管理器。Grape讓咱們快速將maven信息庫依賴項添加到咱們的項目類路徑中,以減小構建文件的定義。Spring Boot 框架編程模型主要是受Groovy編程模型啓發的。Spring Boot 框架在內部取決於這兩個主要組件:GroovyGrape

具體地能夠詳細瞭解Grape JAR依賴項管理器

5 Spring Boot開發環境

好了,上面說了這麼多,不容易,就是爲了作個鋪墊,讓咱們知道Spring boot有哪些核心地東西,都是幹啥用的,接下來就正式進入實踐環節了,咱們從開發環境入手。

Spring boot官方提供的系統需求來看(Spring Boot 2.2.0):

  • 構建工具
    • Marven: 3.3+
    • Gradle:5.x(也支持4.10,但已棄用)
  • Servlet容器(能夠將Spring Boot應用程序部署到任何Servlet 3.1+兼容的容器中)
    • Tomcat 9.0:Servlet4.0
    • Jetty 9.4: Servlet3.1
    • Undertow 2.0: Servlet4.0

5.1 安裝相關軟件

咱們選定相關軟件版本:

  • Open JDK 12: https://jdk.java.net/java-se-ri/12 (JDK也能夠經過安裝好STS後,在STS裏面下載安裝)
  • Open JDK 8: https://jdk.java.net/java-se-ri/8 (注意Window版本沒有64位軟件包)
  • Marven 3.6.2: https://maven.apache.org/download.cgi (在STS安裝好後,已經內部自帶了一個Marven版本,也能夠不用另外安裝Marven)
  • STS 4.13.0: https://spring.io/tools3/sts/all 或 https://spring.io/tools
  • Spring Boot 2.2.0: 能夠像使用任何標準Java庫同樣使用Spring Boot。所以,在類路徑中包含相應的spring-boot-*.jar文件便可。

💡目前爲止已是JDK13了,這裏指的是OpenJDK,Oracle已經在2019年4月16日更改了Oracle JDK許可證(從Java11開始);另外Open JDK應用到生產環境已經通過驗證了的,沒有問題。Spring Boot 2.2.0.RELEASE須要Java 8版本,而且與Java 13(包括)兼容;另外咱們可使用其餘IDE,例如IntelliJ IDEA,NetBeans或Eclipse,一樣,也可使用其餘構建工具,例如Gradle。

  • JDK 安裝: 解壓後就能夠了,而後配置下環境變量(自行搞定);
  • Marven 安裝: 解壓後就能夠了,而後須要在STS中指定該安裝版本,後面會介紹;
  • STS 安裝:解壓後就能夠了。

💡安裝JDK的方式能夠有多種,如在類Linux平臺中能夠經過安裝管理工具直接從遠程鏡像源拉取安裝;

5.2 配置STS

配置JDK:

安裝好STS後,打開軟件-->Window-->Preferences-->Java-->Installed JREs:

配置Marven:

Marven在安裝好STS後,已經默認內部安裝了,不過想要另外指定Marven版本也是能夠的,打開STS-->Window-->Preferences-->Marven-->Installations-->Add添加:

6 總結

這一篇咱們開始從內部瞭解Spring boot,從它的幾個核心模塊講起,知道了Spring boot是如何減小組件依賴和簡化繁雜的配置的,以及講述了Spring boot減小組件依賴和簡化繁雜配置的內部原理,最後開始進入Spring boot實踐,完成了Spring boot的開發環境搭建。至此,咱們開始慢慢走進Spring boot。加油!

7 參考資料

  • https://dzone.com/articles/gradle-vs-maven
  • https://stackoverflow.com/questions/39247487/why-spring-boot-application-class-needs-to-have-configuration-annotation
  • https://www.ibm.com/developerworks/cn/education/java/j-groovy/j-groovy.html
  • https://www.educba.com/groovy-vs-java/
  • https://stackoverflow.com/questions/44172261/how-spring-boot-application-works-internally
  • https://www.zoltanraffai.com/blog/how-does-spring-work-internally/
  • https://docs.spring.io/spring-boot/docs/current/api/allclasses-noframe.html
  • https://docs.spring.io/spring-boot/docs/current/api/org/springframework/boot/autoconfigure/SpringBootApplication.html
  • https://github.com/spring-projects/spring-boot
  • http://docs.groovy-lang.org/latest/html/documentation/grape.html
  • https://juejin.im/post/593386ca2f301e00584f8036
  • https://github.com/spring-projects/spring-boot/tree/master/spring-boot-project/spring-boot-cli/samples
  • https://docs.spring.io/spring-boot/docs/current/api/org/springframework/boot/SpringApplication.html
  • https://www.callicoder.com/spring-boot-actuator/
  • https://www.journaldev.com/7969/spring-boot-tutorial
  • https://www.javatpoint.com/spring-boot-actuator
  • https://blog.51cto.com/luecsc/1964056
  • https://content.pivotal.io/springone-platform-2017/from-zero-to-hero-with-spring-boot-brian-clozel
  • https://docs.spring.io/spring-boot/docs/current/reference/html/getting-started.html#getting-started-system-requirements
  • https://maven.apache.org/download.cgi

本文屬於原創,轉載註明出處,歡迎關注CSDNfreeape或微信小程序小白AI博客 微信公衆號小白AI或者網站 xiaobaiai.net

相關文章
相關標籤/搜索