對Spring Boot的開發環境進行搭建,并對它的特點做進一步的了解,才能更好地對Spring Boot有更深入的介紹。但是無論如何都需要先來搭建Spring Boot的工程。
搭建Spring Boot開發環境使用Spring Boot,首先需要搭建一個快速開發的工程環境。Spring Boot工程的建立存在多種方式,但是因為目前Eclipse和IntelliJ IDEA這兩種IDE的廣泛應用,是以本書隻介紹這兩種IDE環境下的搭建。

搭建Eclipse開發環境首先找到Eclipse的菜單Help→Eclipse Marketplace,打開這個菜單後,可以看到一個新的視窗,然後選擇标簽頁Popular,從中找到Spring Tool Suite(STS)的插件,如圖1-1所示。
這樣就可以點選安裝STS插件了,通過它可以很友善地引入Spring Boot的starter,而starter會引入對應的依賴包和伺服器,這樣就能夠幫助我們快速地搭建開發環境。
下面讓我們使用它建立一個工程。首先點選熟悉的菜單File→New→Project,然後輸入spring過濾一些無關的内容,再選用Spring Starter Project,點選Next,建立項目,如圖1-2所示。
于是它會再打開一個新的對話框,如圖1-3所示。
圖2-3中畫框的地方是我根據自己需要進行的自定義,其中選擇了使用War形式的打包,這意味着将使用的是一個帶有JSP工程的項目。在實際的操作中,讀者也需要根據自己的情況來定義它們。做完這些工作後,就可以點選Next進行下一步了,這樣它又會彈出另外一個視窗,如圖1-4所示。
圖1-1 安裝STS插件
圖1-2 建立Spring Boot工程
圖1-3 配置Spring Boot工程
圖1-4 選擇依賴的starter
這裡選擇AOP和Web,隻是做最簡單的項目而已,是以沒有引入太多的内容。在現實的開發中,可能還需要選擇NoSQL開發工具,如Redis、MongoDB等,還有資料庫,如MySQL,以及持久層Hibernate或者MyBatis等項目的依賴,這些都是開發中經常用到的。當你選中所需要的包後,就可以直接點選Finish,這個時候一個新的Spring Boot工程就建好了,如圖1-5所示。
圖1-5 新的Spring Boot工程
從圖1-5可以看到它是一個Maven項目,其中pom.xml檔案已經建好,而且給我們建立了帶有main方法的Chapter2Application.java檔案和初始化Servlet的ServletInitializer.java檔案。這裡通過Chapter2Application就可以運作Spring Boot工程了。下面再打開工程中的pom.xml檔案,就可以看到這些代碼,如代碼清單1-1所示。
代碼清單1-1 項目中的pom.xml檔案
這些代碼是STS插件根據你選擇的starter依賴來建立的,這樣關于Eclipse搭建的開發環境就結束了。此時隻需要使用Java Application的形式運作Chapter2Application就可以啟動Spring Boot項目。
搭建IntelliJ IDEA開發環境首先是啟動IntelliJ IDEA開發環境,然後選擇Create New Project,就可以看到一個新的視窗。我們選擇Spring Initializr,并且将JDK切換為你想要的版本,如圖1-6所示。
圖1-6 使用IntelliJ IDEA建立Spring Boot工程
點選Next,也會彈出另外一個視窗,它将允許我們進行一定的配置,如圖1-7所示。
圖1-7 配置Spring Boot項目
同樣,圖中加框的地方是我根據自己的需要進行修改的内容。注意,這裡還是選擇了以War打包的形式,然後點選Next,又到了可以選擇starter的視窗,如圖1-8所示。
圖1-8 選擇對應的starter
也與Eclipse一樣,可以根據自己的需要選擇對應的starter進行依賴,IntelliJ IDEA也會為你建好工程,如圖1-9所示。
你也可以看到一個建好的類Chapter2Application、ServletInitializer和Maven的pom.xml檔案。運作Chapter2Application就可以啟動Spring Boot工程,而pom.xml則配置好了你選中的starter依賴,這樣就能夠基于IntelliJ IDEA開發Spring Boot工程了。
圖1-9 IntelliJ IDEA建立Spring Boot工程
到這裡,如果你想使用Jetty或者Undertow作為伺服器,又或者說你想切換背景日志中的商标,那麼可以參考附錄中的内容。
Spring Boot的依賴和自動配置在上節中已經介紹了如何搭建Spring Boot工程,下面需要讨論它為什麼在很少的配置下就能夠運作。
下面以最常用的Spring MVC為例進行說明。首先打開Maven的本地倉庫,找到對應Spring Boot的檔案夾,可以看到圖1-10所示的目錄。
圖1-10 Spring Boot的Maven本地倉庫
這裡先談spring-boot-start-web的内容,未來還會談到spring-boot-autoconfigure檔案夾的内容,是以圖 1-10 中一并加了框。打開spring-boot-start-web檔案夾,就可以看到一個名為spring-boot- starter-web-2.0.0.RELEASE.pom的檔案,打開它就可以看到代碼清單1-2所示的代碼。
代碼清單1-2 spring-boot-starter-web的pom.xml檔案
代碼中的中文注釋是我加入的。從這裡可以看出,當加入spring-boot-starter-web後,它會通過Maven将對應的資源加載到我們的工程中,這樣便能夠形成依賴。但是這樣還不足以運作Spring MVC項目,要運作它還需要對Spring MVC進行配置,讓它能夠生産Spring MVC所需的對象,才能啟用Spring MVC,是以還需要進一步探讨。
為了探讨Spring MVC在Spring Boot自動配置的問題,首先在本地下載下傳的Maven倉庫的目錄spring-boot-autoconfigure中找到
spring-boot-autoconfigure-2.0.0.RELEASE-sources.jar的包。它是一個源碼包,把它解壓縮出來,打開它目錄下的子目錄後,我們就可以看到許多配置類,如圖2-11所示。
圖1-11 Spring Boot的預設配置類
這裡可以看到存在很多的類,其中加框的類DispatcherServletAutoConfiguration就是一個對DispatcherServlet進行自動配置的類。因為本書不是源碼分析的書,是以不對注解這些内容進行深入的探讨,隻是截取DispatcherServletAutoConfiguration源碼中的一個内部類DispatcherServletConfiguration對Spring Boot的自動配置做最基本的講解,如代碼清單1-3所示。
代碼清單1-3 部分源碼分析
注意上述代碼中加粗注解的注釋,這些中文注釋是我加入的,為的是更好地說明Spring Boot的自動配置功能。通過上面的代碼,可以看到Spring Boot内部已經自動為我們做了很多關于DispatcherServlet的配置,其中的@EnableConfigurationProperties還能夠在讀取配置内容的情況下自動生成Spring MVC所需的類,有關這些内容的讨論可以參考附錄。到這裡,應該明白為什麼幾乎在沒有任何配置下就能用Spring Boot啟動Spring MVC項目,這些都是Spring Boot通過Maven依賴找到對應的jar包和嵌入的伺服器,然後使用預設自動配置類來建立預設的開發環境。但是有時候,我們需要對這些預設的環境進行修改以适應個性化的要求,這些在Spring Boot中也是非常簡單的,正如@EnableConfigurationProperties注解那樣,它允許讀入配置檔案的内容來自定義自動初始化所需的内容,下節将探讨這個問題。
使用自定義配置上節讨論了Spring Boot存在自動裝配元件和自定義的配置,這些它都給予了開發者預設的約定配置項。關于這些内容,可以在它公布的網址上看到所有的配置項,網址是http://docs.spring.io/spring- boot/docs/current-SNAPSHOT/reference/htmlsingle/#appendix。這些配置項多達300多項,是以十分繁複,好在我們并不需要全部去配置,隻是根據自己工程的需要引入對應的starter,對其進行必要的配置就可以了。
本書不會像流水賬那樣羅列這些配置項,因為這些很無趣也沒有必要,而隻是根據講解的需要,引入對應的stater,才會讨論對應的配置項。将來在讨論資料庫、NoSQL等内容時,才會讨論對應的配置項。這裡需要我們記住的是通過這些約定的配置就可以在很大程度上自定義開發環境,以适應真實需求。這就是Spring Boot的理念,配置盡量簡單并且存在約定,屏蔽Spring内部的細節,使得Spring能夠開箱後經過簡單的配置後即可讓開發者使用,以滿足快速開發、部署和測試的需要。
如果你按照上述使用Eclipse或者IntelliJ IDEA進行建立工程,那麼可以在項目中發現它還會為你建立一個屬性檔案application.properties,如圖2-12所示。
它是一個預設的配置檔案,通過它可以根據自己的需要實作自定義。例如,假設目前8080端口已經被占用,我們希望使用8090端口啟動Tomcat,那麼隻需要在這個檔案中添加一行:
圖1-12 Spring Boot的配置檔案
這樣以Java Application的形式運作Chapter2Application就可以看到Spring Boot綁定的Tomcat的啟動日志:
注意,通過加粗的這行日志可以看到Tomcat是以8090端口啟動的,相信讀者明白了。也就是說,我們隻需要修改配置檔案,就能将開發的預設配置變為自定義配置。
事實上,Spring Boot的參數配置除了使用properties檔案之外,還可以使用yml檔案等,它會以下列的優先級順序進行加載:
指令行參數;
來自java:comp/env的JNDI屬性;
Java系統屬性(System.getProperties());
作業系統環境變量;
RandomValuePropertySource配置的random.*屬性值;
jar包外部的application-{profile}.properties或application.yml(帶spring.profile)配置檔案;
jar包内部的application-{profile}.properties或application.ym(帶spring.profile)配置檔案;
jar包外部的application.properties或application.yml(不帶spring.profile)配置檔案;
jar包内部的application.properties或application.ym(不帶spring.profile)配置檔案;
@Configuration注解類上的@PropertySource;
實際上,yml檔案的配置與properties檔案隻是簡寫和縮進的差别,是以差異并不大,是以本書統一使用properties檔案進行配置。對于需要使用yml檔案的讀者,隻是需要稍加改動即可。
開發自己的Spring Boot項目上面我們修改了伺服器的啟動端口,有時候還需要修改Spring MVC的視圖解析器(ViewResolver)。Spring MVC的視圖解析器的作用主要是定位視圖,也就是當控制器隻是傳回一個邏輯名稱的時候,是沒有辦法直接對應找到視圖的,這就需要視圖解析器進行解析了。在實際的開發中最常用的視圖之一就是JSP,例如,現在控制器中傳回一個字元串“index”,那麼我們希望它對應的是開發項目的/WEB-INF/jsp/index.jsp檔案。如果你還對Spring MVC不熟悉,那也沒有關系,未來我們還會談到它,這裡的代碼很簡單,你隻需要依葫蘆畫瓢就可以體驗運作Spring Boot項目了。下面的主要任務就是如果通過Spring Boot完成這個功能。首先我們需要在Maven的pom.xml中加入JSP和JSTL的依賴包,如代碼清單1-4所示。
代碼清單1-4 新增JSP和JSTL的Maven依賴配置
為了配置視圖解析器(ViewResolver),将application.properties檔案修改為如代碼清單`-5所示。
代碼清單1-5 定義視圖前字尾
這裡的spring.mvc.view.prefix和spring.mvc.view.suffix是Spring Boot與我們約定的視圖字首和字尾配置,意思是找到檔案夾/WEB-INF/jsp/下以.jsp為字尾的JSP檔案,那麼字首和字尾之間顯然又缺了一個檔案名稱,在Spring MVC機制中,這個名稱則是由控制器(Controller)給出的,為此建立一個控制器IndexController,其代碼如代碼清單1-6所示。
代碼清單1-6 開發控制器
這裡定義了一個映射為/index的路徑,然後方法傳回了“index”,這樣它就與之前配置的字首和字尾結合起來找對應的jsp檔案,為此我們還需要開發一個對應的jsp檔案,為此我們先再建一個/webapp/WEB-INF/jsp/index.jsp檔案,如代碼清單1-7所示。
代碼清單1-7 開發視圖(/webapp/WEB-INF/jsp/index.jsp)
這樣我們就完成了一個簡單的控制器,并且讓視圖解析器找到視圖的功能。從上面來看定義視圖解析器,在Spring Boot中隻需要通過配置檔案定義視圖解析器的前字尾即可,而無須任何代碼,這是因為Spring Boot給了我們自定義配置項,它會讀入這些自定義的配置項,為我們生成Spring MVC中的視圖解析器。正如它所承諾的盡可能地配置Spring開發環境,然後再看到即将運作Chapter2Application.java檔案,如代碼清單1-8所示。
代碼清單1-8 Spring Boot運作檔案Chapter2Application
這裡的注解@SpringBootApplication标志着這是一個Spring Boot入門檔案。加粗的代碼則是以Chapter2Application類作為配置類來運作Spring Boot項目,于是Spring Boot就會根據你在Maven加載的依賴來完成運作了。接下來我們以Java Application的形式運作類Chapter2Application,就可以看到Tomcat的運作日志。由于已經把端口修改為了8090,是以打開浏覽器後輸入http://localhost:8090/index,就可以看到運作的結果如圖1-13所示。
圖1-13 測試視圖解析器
這樣我們就搭建完成Spring Boot的開發環境了。因為Spring Boot是基于Spring原理基礎之上的,是以在讨論Spring Boot時,也十分有必要介紹Spring的技術原理,這樣才能知其然,亦知其是以然。這些是後續章節的任務了。

楊開振 著
Spring架構是Java EE開發的事實标準,而Spring Boot是業界最流行的微服務開發架構。本書從一個最簡單的工程開始講解Spring Boot企業級開發,其内容包含全注解下的Spring IoC和AOP、資料庫程式設計、資料庫事務、NoSQL技術、Spring MVC、Spring 5新一代響應式架構WebFlux、REST風格和Spring Cloud分布式開發等。
掃碼關注我們
在“異步社群”背景回複“關注”,即可免費獲得2000門線上視訊課程