265
技術社區[雲棲]
《精通Spring MVC 4》——1.5 那就正式開始吧
本節書摘來自異步社區《精通Spring MVC 4》一書中的第1章,第1.5節,作者:【美】Geoffroy Warin著,更多章節內容可以訪問雲棲社區“異步社區”公眾號查看
1.5 那就正式開始吧
現在Web應用已經準備就緒,先看一下它是如何編寫的。在進一步學習之前,我們可以將工作的成果保存到Git上。
在Windows下,需要安裝Git bash,這可以在https://msysgit.github.io找到。在Mac下,如果你使用homebrew的話,很可能已經安裝過Git了,否則的話,使用brew install git命令來進行安裝。
如果要使用Git版本化我們的工作內容,那麼可以在控製台中輸入如下的命令:
$ cd app
$ git init
使用IntelliJ的話,要忽略自動生成的文件,即“.idea”和“*.iml”。使用Eclipse的話,應該將“.classpath”文件和“.settings”文件夾提交上去。不管是哪種情況,都要忽略“.gradle”文件夾和build文件夾。
創建一個包含如下文本內容的“.gitignore“文件:
# IntelliJ project files
.idea
*.iml
# gradle
.gradle
build
現在,我們可以將其他文件添加到Git中:
$ git add .
$ git commit -m "Generated with curl start.Spring.io"
[master (root-commit) eded363] Generated with curl start.Spring.io
4 files changed, 75 insertions(+)
create mode 100644 build.Gradle
create mode 100644 src/main/Java/com/geowarin/AppApplication.Java
create mode 100644 src/main/resources/application.properties
create mode 100644 src/test/Java/com/geowarin/AppApplicationTests.Java
1.5.1 Gradle構建
如果你還不熟悉Gradle的話,那麼可以將其視為Maven的繼任者,它是一個現代化的構建工具。與Maven類似,它會使用約定,例如如何組織Java應用的結構。我們的源碼依然會放在“src/main/java”之中,Web應用的代碼放到“src/main/webapp”之中,諸如此類。與Maven類似,我們可以使用Gradle插件來處理各種構建任務。但是,Gradle真正的閃光點在於,它允許我們使用Groovy DSL編寫自己的構建任務。默認庫使得管理文件、聲明任務之間的依賴以及增量執行job都變得非常容易。
如果你使用OS X的話,那麼可以通過brew install gradle命令,借助brew來安裝Gradle。在任意的*NIX的係統下(包括Mac),都可以使用gvm(https://gvmtool.net/)來進行安裝。另外,也可以在https://Gradle.org/downloads下獲取二進製分發包。
使用Gradle創建應用的第一個最佳實踐就是生成Gradle包裝器(wrapper)。Gradle包裝器是一個小的腳本,它能夠在你的代碼中進行共享,從而確保會使用相同版本的Gradle來構建你的應用。
生成包裝器的命令是gradle wrapper:
$ gradle wrapper
:wrapper
BUILD SUCCESSFUL
Total time: 6.699 secs
如果我們看一下新創建的文件,可以看到有兩個腳本和兩個目錄:
$ git status -s
?? .gradle/
?? gradle/
?? gradlew
?? gradlew.bat
在“.gradle”目錄中包含了Gradle二進製文件,我們不希望將其添加到版本控製之中。
前麵已經忽略了這個文件和構建目錄,所以可以安全地對其他內容執行git add操作:
$ git add .
$ git commit -m "Added Gradle wrapper"
gradle 目錄包含了如何得到二進製文件的信息。另外兩個文件是腳本:用於 Windows的批處理腳本(gradlew.bat)以及用於其他係統的shell腳本。
我們可以使用Gradle運行應用,替換借助IDE來執行應用的方式:
$ ./gradlew bootrun
執行上麵的命令將會運行一個嵌入式的Tomcat,應用會位於它裏麵!
如圖1-7所示,日誌提示服務器運行在8080端口上,我們檢查一下。
圖1-7
可以想象到你內心的失望,因為應用還沒有為完全公開做好準備。
換句話說,在工程中,這兩個文件所完成的工作內容還是很讓人振奮的。我們來看一下。
首先是Gradle構建文件,也就是build.gradle:
buildscript {
ext {
springBootVersion = '1.2.5.RELEASE'
}
repositories {
mavenCentral()
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-
plugin:${springBootVersion}")
classpath("io.spring.gradle:dependency-management-
plugin:0.5.1.RELEASE")
}
}
apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'idea'
apply plugin: 'spring-boot'
apply plugin: 'io.spring.dependency-management'
jar {
baseName = 'masterSpringMvc'
version = '0.0.1-SNAPSHOT'
}
sourceCompatibility = 1.8
targetCompatibility = 1.8
repositories {
mavenCentral()
}
dependencies {
compile("org.springframework.boot:spring-boot-starter-web")
testCompile("org.springframework.boot:spring-boot-starter-test")
}
eclipse {
classpath {
containers.remove('org.eclipse.jdt.launching.JRE_CONTAINER')
containers 'org.eclipse.jdt.launching.JRE_CONTAINER/org.
eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8'
}
}
task wrapper(type: Wrapper) {
gradleVersion = '2.3'
}
在這裏,都看到了什麼呢?
對Spring Boot插件的依賴,它分布在Maven中央倉庫中。
我們的項目是Java工程。Gradle可以為IntelliJ或Eclipse生成IDE工程文件。
該應用將會生成JAR文件。
我們的項目的依賴是托管在Maven中央倉庫中的。
類路徑在生產環境下包含spring-boot-starter-web,在測試環境中,還包含spring- boot-starter-test。
針對Eclipse的一些額外配置。
Gradle包裝器的版本是2.3。
Spring Boot插件將會產生一個胖(fat)JAR文件,其中包含了項目的所有依賴。要構建的話,隻需輸入:
./gradlew build
我們將會在“build/libs”目錄下找到這個JAR文件。該目錄下會包含兩個文件,其中一個為胖JAR包,名為masterSpringMvc-0.0.1-SNAPSHOT.jar,另外一個是普通的JAR文件,名為masterSpringMvc-0.0.1-SNAPSHOT. jar.original,這個文件不包含任何的依賴。
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)配置。
稍後,我們將會看到更多的內容,首先從下一節開始吧!
1.5.2 讓我們看一下代碼
這裏將會展現運行應用的所有代碼,它是一個經典的main函數,這種方式有很大的優勢,因為我們可以在IDE中像運行其他程序那樣運行這個應用。我們可以對其進行調試,並且不需要插件就能實現一些類的重新加載。
在開發模式下,當我們在Eclipse中保存文件或者在IntelliJ中點擊“Make Project”就會觸發重新加載的過程。隻有JVM支持切換至新編譯版本的類文件時,它才是可行的,如果修改靜態變量或配置文件的話,我們必須要重新加載應用。
主類如下所示:
package masterSpringMvc;
import org.Springframework.boot.SpringApplication;
import org.Springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class AppApplication {
public static void main(String[] args) {
SpringApplication.run(AppApplication.class, args);
}
}
需要注意的是@SpringBootApplication注解,如果看一下這個注解的代碼的話,就會發現它實際上組合了3個其他的注解,也就是@Configuration、@EnableAutoConfiguration和@ComponentScan:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Configuration
@EnableAutoConfiguration
@ComponentScan
public @interface SpringBootApplication {
/**
* Exclude specific auto-configuration classes such that they will
never be applied.
*/
Class<?>[] exclude() default {};
}
如果你之前使用Java代碼配置過Spring應用的話,那麼你應該對@Configuration非常熟悉。它表明我們的這個類將會處理Spring的常規配置,如bean的聲明。
@ComponentScan也是一個比較經典的注解,它會告訴Spring去哪裏查找Spring組件(服務、控製器等)。在默認情況下,這個注解將會掃描當前包以及該包下麵的所有子包。
在這裏,比較新穎的是@EnableAutoConfiguration注解,它會指導Spring Boot發揮其魔力。如果你將其移除掉的話,就無法從Spring Boot的自動配置中收益了。
使用Spring Boot來編寫MVC應用的第一步通常是在代碼中添加控製器。將控製器放到controller子包中,這樣它就能夠被@ComponentScan注解所發現:
package masterSpringMvc.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class HelloController {
@RequestMapping("/")
@ResponseBody
public String hello() {
return "Hello, world!";
}
}
現在,如果打開瀏覽器並訪問https://localhost:8080的話,就能看到我們鍾愛的“Hello, world!”被輸出了出來(見圖1-8)。
圖1-8
最後更新:2017-05-27 15:01:42