javascript
Spring Boot-Spring Tool Suit + Gradle 构建第一个Spring Boot 项目02
- 概述
- 將工程托管到Github
- Gradle構建
- 為什么一個main函數就能啟動web并提供這么多功能
- 幕后的 Spring Boot
- 分發器和 multipart 配置
- 視圖解析器、靜態資源以及區域配置
- 錯誤與轉碼配置
- 嵌入式 Servlet 容器(Tomcat)的配置
- HTTP 端口
- SSL 配置
- 其他配置
概述
Spring Tool Suit + Gradle 構建第一個Spring Boot 項目01中完成了基本環境的搭建,也順利的啟動了SpringBoot。
將工程托管到Github
不過,真正開始我們的系列之前,我們先將工程托管到GitHub上吧
請參考以前的博文 Git-將已有的項目轉換為GIT項目托管到 GITHUB 倉庫
Windows操作系統,我們使用GitBash來托管到Github.
Mr.Yang@Mr MINGW64 ~ $ cd d:Mr.Yang@Mr MINGW64 /d $ cd workspaceMr.Yang@Mr MINGW64 /d/workspace $ cd workspace-sts-3.9.2/Mr.Yang@Mr MINGW64 /d/workspace/workspace-sts-3.9.2 $ cd masterSpringMvc/Mr.Yang@Mr MINGW64 /d/workspace/workspace-sts-3.9.2/masterSpringMvc $ ls bin/ build/ build.gradle gradle/ gradlew* gradlew.bat src/Mr.Yang@Mr MINGW64 /d/workspace/workspace-sts-3.9.2/masterSpringMvc $ git init Initialized empty Git repository in D:/workspace/workspace-sts-3.9.2/masterSprin gMvc/.git/Mr.Yang@Mr MINGW64 /d/workspace/workspace-sts-3.9.2/masterSpringMvc (master) $ ls -al total 70 drwxr-xr-x 1 Mr.Yang 197609 0 3月 7 18:22 ./ drwxr-xr-x 1 Mr.Yang 197609 0 3月 7 15:48 ../ -rw-r--r-- 1 Mr.Yang 197609 28851 3月 7 15:48 .classpath drwxr-xr-x 1 Mr.Yang 197609 0 3月 7 18:22 .git/ -rw-r--r-- 1 Mr.Yang 197609 260 3月 7 15:48 .gitignore drwxr-xr-x 1 Mr.Yang 197609 0 3月 7 15:48 .gradle/ -rw-r--r-- 1 Mr.Yang 197609 1026 3月 7 15:49 .project drwxr-xr-x 1 Mr.Yang 197609 0 3月 7 15:49 .settings/ drwxr-xr-x 1 Mr.Yang 197609 0 3月 7 15:49 bin/ drwxr-xr-x 1 Mr.Yang 197609 0 3月 7 15:48 build/ -rw-r--r-- 1 Mr.Yang 197609 601 3月 7 15:48 build.gradle drwxr-xr-x 1 Mr.Yang 197609 0 3月 7 15:48 gradle/ -rwxr-xr-x 1 Mr.Yang 197609 5299 3月 7 15:48 gradlew* -rw-r--r-- 1 Mr.Yang 197609 2260 3月 7 15:48 gradlew.bat drwxr-xr-x 1 Mr.Yang 197609 0 3月 7 15:48 src/Mr.Yang@Mr MINGW64 /d/workspace/workspace-sts-3.9.2/masterSpringMvc (master) $ vim .gitignore查看生成的 .gitignore
.gradle /build/ !gradle/wrapper/gradle-wrapper.jar### STS ### .apt_generated .classpath .factorypath .project .settings .springBeans### IntelliJ IDEA ### .idea *.iws *.iml *.ipr### NetBeans ### nbproject/private/ build/ nbbuild/ dist/ nbdist/ .nb-gradle/使用 IntelliJ 的話,要忽略自動生成的文件,即“.idea”和“*.iml”。使用 Eclipse 的話,應該將“.classpath”文件和“.settings”文件夾提交上去。不管是哪種情況,都要忽略“.gradle”文件夾和 build 文件夾。
Mr.Yang@Mr MINGW64 /d/workspace/workspace-sts-3.9.2/masterSpringMvc (master) $ git add . warning: LF will be replaced by CRLF in .gitignore. The file will have its original line endings in your working directory. warning: LF will be replaced by CRLF in build.gradle. The file will have its original line endings in your working directory. warning: LF will be replaced by CRLF in gradle/wrapper/gradle-wrapper.properties. The file will have its original line endings in your working directory. warning: LF will be replaced by CRLF in gradlew. The file will have its original line endings in your working directory. warning: LF will be replaced by CRLF in src/main/java/masterSpringMvc/MasterSpringMvcApplication.java. The file will have its original line endings in your working directory. warning: LF will be replaced by CRLF in src/test/java/masterSpringMvc/MasterSpringMvcApplicationTests.java. The file will have its original line endings in your working directory.Mr.Yang@Mr MINGW64 /d/workspace/workspace-sts-3.9.2/masterSpringMvc (master) $ git commit -m "Initial commit" [master (root-commit) aebd701] Initial commit12 files changed, 345 insertions(+)create mode 100644 .gitignorecreate mode 100644 bin/main/application.propertiescreate mode 100644 bin/main/masterSpringMvc/MasterSpringMvcApplication.classcreate mode 100644 bin/test/masterSpringMvc/MasterSpringMvcApplicationTests.classcreate mode 100644 build.gradlecreate mode 100644 gradle/wrapper/gradle-wrapper.jarcreate mode 100644 gradle/wrapper/gradle-wrapper.propertiescreate mode 100644 gradlewcreate mode 100644 gradlew.batcreate mode 100644 src/main/java/masterSpringMvc/MasterSpringMvcApplication.javacreate mode 100644 src/main/resources/application.propertiescreate mode 100644 src/test/java/masterSpringMvc/MasterSpringMvcApplicationTests.java Mr.Yang@Mr MINGW64 /d/workspace/workspace-sts-3.9.2/masterSpringMvc (master) $ git remote add origin https://github.com/yangshangwei/masterSpringMvc.gitMr.Yang@Mr MINGW64 /d/workspace/workspace-sts-3.9.2/masterSpringMvc (master) $ git remote -v origin https://github.com/yangshangwei/masterSpringMvc.git (fetch) origin https://github.com/yangshangwei/masterSpringMvc.git (push) Mr.Yang@Mr MINGW64 /d/workspace/workspace-sts-3.9.2/masterSpringMvc (master) $ git push -u origin master fatal: HttpRequestException encountered.????????????? Username for 'https://github.com': yangshangwei Counting objects: 28, done. Delta compression using up to 4 threads. Compressing objects: 100% (22/22), done. Writing objects: 100% (28/28), 53.90 KiB | 0 bytes/s, done. Total 28 (delta 0), reused 0 (delta 0) To https://github.com/yangshangwei/masterSpringMvc.git* [new branch] master -> master Branch master set up to track remote branch master from origin.Mr.Yang@Mr MINGW64 /d/workspace/workspace-sts-3.9.2/masterSpringMvc (master)最后將本地項目關聯到Git
如果你還不了解 Git 的話,我推薦下面的兩個教程:
? https://try.github.io,這是一個很好的交互式教程,可以引導你一步步地學習基礎的 Git 命令;
? http://pcottle.github.io/learnGitBranching,這是一個很棒的教程,它將 Git 以類似于樹形的結構進行了可視化,它同時展現了 Git 的基本和高級功能。
Gradle構建
如果你還不熟悉 Gradle 的話,那么可以將其視為 Maven 的繼任者,它是一個現代化的構建工具。與 Maven 類似,它會使用約定,例如如何組織 Java 應用的結構。我們的源碼依然會放在“src/main/java”之中,Web 應用的代碼放到“src/main/webapp”之中,諸如此類。
與 Maven 類似,我們可以使用 Gradle 插件來處理各種構建任務。但是,Gradle 真正的閃光點在于,它允許我們使用 Groovy DSL 編寫自己的構建任務。默認庫使得管理文件、聲明任務之間的依賴以及增量執行 job 都變得非常容易。
我們來看下自動生成grable配置文件
buildscript {ext {springBootVersion = '2.0.0.RELEASE'}repositories {mavenCentral()}dependencies {classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")} }apply plugin: 'java' apply plugin: 'eclipse' apply plugin: 'org.springframework.boot' apply plugin: 'io.spring.dependency-management'group = 'masterSpringMvc' version = '0.0.1-SNAPSHOT' sourceCompatibility = 1.8repositories {mavenCentral() }dependencies {compile('org.springframework.boot:spring-boot-starter-web')testCompile('org.springframework.boot:spring-boot-starter-test') }在這里,都看到了什么呢?
? 對 Spring Boot 插件的依賴,它分布在 Maven 中央倉庫中。
? 我們的項目是 Java 工程。Gradle 可以為 Eclipse 生成 IDE 工程文件。
? 我們的項目的依賴是托管在 Maven 中央倉庫中的。
? 類路徑在生產環境下包含 spring-boot-starter-web,在測試環境中,還包含 spring-boot-starter-test。
可運行的 JAR
Spring Boot 主要的一個優勢在于將應用所需的所有內容都放到一個易于重發布的JAR 文件中,其中包含了Web服務器。如果你運行 java jar masterSpringMvc-0.0.1-SNAPSHOT.jar 的話,Tomcat 將會在 8080 端口上啟動,就像在開發期一樣。如果要將其部署到生產環境或云中,這都是相當便利的。
在這里,主要的依賴是 spring-boot-starter-web,Spring Boot 提供了很多的 Starter,它們會對應用的很多方面進行自動化配置,這是通過提供典型的依賴和 Spring 配置來實現的。
例如,spring-boot-starter-web 將會包含對 tomcat-embedded 和 Spring MVC 的依賴。它會自動運行 Spring MVC 最為常用的配置并提供一個分發器(dispatcher),使其監聽“/”根路徑,還會提供錯誤處理頁面,就像之前所看到的 404 頁面那樣。除此之外,還有一個典型的視圖解析器(view resolver)配置。
為什么一個main函數就能啟動web并提供這么多功能
我們啟動應用時,是從main 函數中啟動,這種方式有很大的優勢,因為我們可以在 IDE 中像運行其他程序那樣運行這個應用。我們可以對其進行調試,并且不需要插件就能實現一些類的重新加載。
在開發模式下,當我們在 Eclipse 中保存文件或者在 IntelliJ 中點擊“Make Project”就會觸發重新加載的過程。只有 JVM 支持切換至新編譯版本的類文件時,它才是可行的,如果修改靜態變量或配置文件的話,我們必須要重新加載應用。
啟動類
package masterSpringMvc;import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication public class MasterSpringMvcApplication {public static void main(String[] args) {SpringApplication.run(MasterSpringMvcApplication.class, args);} }需要注意的是@SpringBootApplication 注解,如果看一下這個注解的代碼的話,就會發現它實際上組合了 3 個其他的注解,也就是@SpringBootConfiguration、@EnableAutoConfiguration 和@ComponentScan
如果你之前使用過基于Java的配置,那么你應該對@Configuration 非常熟悉。它表明我們的這個類將會處理 Spring的常規配置,如 bean 的聲明。
@ComponentScan 也是一個比較經典的注解,它會告訴 Spring 去哪里查找 Spring組件(服務、控制器等)。在默認情況下,這個注解將會掃描當前包以及該包下面的所有子包。
在這里,比較新穎的是@EnableAutoConfiguration 注解,它會指導 Spring Boot 發揮其魔力。如果你將其移除掉的話,就無法從 Spring Boot 的自動配置中受益了。
使用 Spring Boot 來編寫 MVC 應用的第一步通常是在代碼中添加控制器。將控制器放到 controller 子包中,這樣它就能夠被@ComponentScan 注解所發現:
啟動Spring Boot,訪問 http://localhost:8080/
是不是已經不是我們第一次訪問時的WhiteableError Page了?
幕后的 Spring Boot
我們之前構建傳統的Spring MVC 應用,都會編寫相關的XML 文件或Java
注解配置類。
一般來講,初始的步驟如下所示:
- 1.初始化 Spring MVC 的 DispatcherServlet;
- 2.搭建轉碼過濾器,保證客戶端請求進行正確地轉碼;
- 3.搭建視圖解析器(view resolver),告訴 Spring 去哪里查找視圖,以及它們是使用哪種方言編寫的(JSP、Thymeleaf 模板等);
- 4.配置靜態資源的位置(CSS、JS);
- 5.配置所支持的地域以及資源 bundle;
- 6.配置 multipart 解析器,保證文件上傳能夠正常工作;
- 7.將 Tomcat 或 Jetty 包含進來,從而能夠在 Web 服務器上運行我們的應用;
- 8.建立錯誤頁面(如 404)。
不過,Spring Boot 為我們處理了所有的事情。因為這些配置一般是與應用相關的,所以你可以無限制地將它們進行組合。
在一定程度上來講,Spring Boot 是帶有一定傾向性的 Spring 項目配置器。它基于約定,并且默認會在你的項目中使用這些約定。
分發器和 multipart 配置
接下來,讓我們看一下在幕后到底發生了什么。
我們使用默認生成的Spring Boot配置文件,并將其設置為debug模式。在src/main/resources/application.properties 中添加下面這一行:
重新啟動應用,觀察日志,就能看到Spring Boot 的自動配置報告。它分為兩部分:一部分是匹配上的(positive matches),列出了應用中,所有的自動配置,另一部分是沒有匹配上的(negative matches),這部分是應用在啟動的時候,需求沒有滿足的Spring Boot 自動配置:
2018-03-07 19:56:18.561 DEBUG 18780 --- [ main] ConditionEvaluationReportLoggingListener : ============================ CONDITIONS EVALUATION REPORT ============================Positive matches: ----------------- ....... ....... .......Negative matches: ----------------- ....... ....... .......因篇幅原因,這里就不貼出來了,實在是太多,可以自行觀察控制臺。
重點關注DispatcherServletAutoConfiguration注解
這是一個典型的 Spring Boot 配置類。
? 與其他的 Spring 配置類相同,它使用了@Configuration 注解;
? 一般會通過@Order 注解來聲明優先等級,可以看到 DispatcherServletAutoConfiguration需要優先進行配置;
? 其中也可以包含一些提示信息,如@AutoConfigureAfter 或@AutoConfigureBefore,從而進一步細化配置處理的順序;
? 它還支持在特定的條件下啟用某項功能。通過使用@ConditionalOnClass
(DispatcherServlet.class)這個特殊的配置,能夠確保我們的類路徑下包含
DispatcherServlet,這能夠很好地表明 Spring MVC 位于類路徑中,用戶當前希望將其啟動起來。
這個文件中還包含了 Spring MVC 分發器 Servlet 和 multipart 解析器的典型配置。整個Spring MVC 配置被拆分到了多個文件之中。
另外,值得一提的是,這些 bean 會遵循特定的規則,以此來檢查是否處于激活狀態。在@Conditional(DefaultDispatcherServletCondition.class)條件滿足的情況下,ServletRegistrationBean 函數才會啟用,這有些復雜,但是能夠檢查在你的配置中,是否已經注冊了分發器 Servlet。
只有在滿足@ConditionalOnMissingBean(name=DispatcherServlet.MULTIPART_RESOLVER_BEAN_NAME)條件的情況下,MultipartResolver 函數才會處于激活狀態,例如,當我們自己還沒有注冊的時候。
這意味著 Spring Boot 僅僅是基于常見的使用場景,幫助我們對應用進行配置。不過,可以在任意的地方覆蓋這些默認值,并聲明自己的配置。
因此,通過查看 DispatcherServletAutoConfiguration,就了解了為什么我們已經擁有了分發器 Servlet 和 multipart 解析器。
視圖解析器、靜態資源以及區域配置
重點關注WebMvcAutoConfiguration注解 ,它聲明了視圖解析器、地域解析器(localeresolver)以及靜態資源的位置
視圖解析器的配置并沒有什么特殊之處,這里真正有意思的是使用了配置屬性,從而允許用戶對其進行自定義。
它的意思就是說“將會在用戶的 application.properties 文件中查找兩個變量,這兩個變量的名字是 spring.view.prefix 和 spring.view.suffix”。在配置中只需兩行代碼就能將視圖解析器搭建起來了,這是非常便利的。
錯誤與轉碼配置
還記得在沒有添加控制器的時候,第一次啟動應用嗎?當時看到了一個有意思的“Whitelabel Error Page”輸出。
重點關注ErrorMvcAutoConfiguration注解
定義了一個 bean,即 DefaultErrorAttributes,它通過特定的屬性暴露了有用的錯誤信息,這些屬性包括狀態、錯誤碼和相關的棧跟蹤信息。
? 定義了一個 BasicErrorController bean,這是一個 MVC 控制器,負責展現我們所看到的錯誤頁面。
? 允許我們將 Spring Boot 的 whitelabel 錯誤頁面設置為無效,這需要將配置文件application.properties 中的 error.whitelable.enabled 設置為 false。
? 我們還可以借助模板引擎提供自己的錯誤頁面。例如,它的名字是 error.html,ErrorTemplateMissingCondition 條件會對此進行檢查。
至于轉碼的問題,非常簡單的HttpEncodingAutoConfiguration 將會負責處理相關的事宜,這是通過提供 Spring 的 CharacterEncodingFilter 類來實現的。通過 spring.http.encoding.charset配置,我們可以覆蓋默認的編碼(“UTF-8”),也可以通過 spring.http.encoding.enabled 禁用這項配置。
嵌入式 Servlet 容器(Tomcat)的配置
默認情況下,Spring Boot 在打包和運行應用時,會使用 Tomcat 嵌入式 API(Tomcat embedded API)。
重點關注EmbeddedServletContainerAutoConfiguration注解
可以將 Spring Boot 與 Tomcat、tc-server、Jetty 或者 Undertow 結合使用。服務器可以很容易地進行替換,只需將 spring-boot-starter-tomcat JAR 依賴移除掉,并將其替換為 Jetty或 Undertow 對應的依賴即可。
HTTP 端口
通過在 application.properties 文件中定義 server.port 屬性或者定義名為 SERVER_PORT的環境變量,我們可以修改默認的 HTTP 端口。
通過將該變量設置為?1,可以禁用 HTTP,或者將其配置為 0,這樣的話,就會在隨機的端口上啟動應用。對于測試,這是很便利的。
SSL 配置
配置 SSL 是一項很麻煩的事情,但是 Spring Boot 有一項很簡單的解決方案。我們只需一點屬性就能保護服務器了:
server.port = 8443 server.ssl.key-store = classpath:keystore.jks server.ssl.key-store-password = secret server.ssl.key-password = another-secret不過,為了使上面的例子運行起來,我們需要生成一個 keystore 文件
如何制作,請參考以前的博文
http://blog.csdn.net/yangshangwei/article/details/72725123#t5
其他配置
在配置中,我們可以通過簡單地聲明@Bean 元素來添加典型的 Java Web 元素,如Servlet、Filter 和 ServletContextListener。
除此之外,Spring Boot 還為我們內置了 3 項內容:
- ? 在 JacksonAutoConfiguration 中,聲明使用 Jackson 進行 JSON 序列化;
- ? 在HttpMessageConvertersAutoConfiguration中,聲明了默認的HttpMessageConverter;
- ? 在 JmxAutoConfiguration 中,聲明了 JMX 功能。
至此,我們現在已經有了一個非常簡陋的 Spring Web 應用,雖然我們沒有對其進行什么配置,但是它可以輸出 RESTful JSON 的“Hello Spring Boot”。 其中原理,暫不深究~
總結
以上是生活随笔為你收集整理的Spring Boot-Spring Tool Suit + Gradle 构建第一个Spring Boot 项目02的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring Boot-Spring T
- 下一篇: gradle idea java ssm