Spring Boot 2.0官方教程翻譯-Building an Application with Spring Boot
原文Building an Application with Spring Boot
本指南提供了Spring Boot如何幫助您加速和簡化應用程序開發的示例。當您閱讀更多的Spring入門指南時,您將看到更多Spring Boot的用例。他們提供了快速體驗Spring Boot的方法。如果您想創建自己的基於Spring boot的項目,請訪問Spring Initializr,填寫您的項目詳細信息,選擇您的選項,您可以下載Maven構建文件,或者將一個打包的項目作為zip文件下載。
目標
您將構建一個帶有Spring Boot的簡單web應用程序,並為其添加一些有用的服務。
您需要
- 大約15分鐘
- 一個編輯器或者IDE
- JDK 1.8 或者更高
- Gradle 2.3+或 Maven 3.0+
- 你也可以把項目導入如下的IDE
- Spring Tool Suite (STS)
- IntelliJ IDEA
如何完成這個指南
像大多數Spring入門指南一樣,您可以從頭開始完成每一步,或者您可以跳過您已經熟悉的基本設置步驟。無論哪種方式,最終都會得到可以工作的代碼。
如果要從頭開始,請查閱使用Gradle構建.
如果要跳過基礎,執行如下步驟:
- 下載 然後解壓這個工程的代碼,或者直接使用Git克隆這個項目:
git clone
https://github.com/spring-guides/gs-spring-boot.git
- 進入
gs-spring-boot/initial
目錄 - 從 [初始化] 章節開始.
當你完成了如上步驟,你會在 gs-spring-boot/complete
目錄中找到你構建的結構
學習如何使用Spring Boot
Spring Boot提供了一種快速構建應用程序的方法。它會檢查您的類路徑和您配置的bean,對您缺失的配置做出合理的猜測,並設置它。使用Spring Boot,您可以更關注業務特性,而較少關注配置細節。
例如:
- 需要使用Spring MVC ?實際開發中總是需要一些特定的bean,Spring Boot會自動添加它們。Spring MVC應用都需要一個servlet容器,所以Spring Boot會自動配置嵌入式Tomcat。
- 需要使用 Jetty?如果您需要嵌入Jetty,而不是Tomcat。Spring Boot為您處理。
- 需要使用Thymeleaf嗎?有一些bean必須始終添加到您的應用程序上下文中;Spring Boot會為您添加了它們。
這些只是Spring Boot自動配置的幾個例子。與此同時,Spring Boot不會妨礙你使用自己的方法來配置。例如,Spring Boot會自動向您的應用程序上下文添加一個 SpringTemplateEngine 來使用Thymeleaf。如果您需要使用自定義的 SpringTemplateEngine ,那麼Spring Boot就不會自動額外添加。這樣會極大減輕你配置的工作量。
Spring Boot不會生成代碼或對您的文件進行編輯。相反,當您啟動應用程序時,Spring引導動態地將bean和設置連接起來,並將它們應用到您的應用程序上下文中。
創建一個簡單的web應用程序
現在,您可以為一個簡單的web應用程序創建一個web控制器。
src/main/java/hello/HelloController.java
package hello;import org.springframework.web.bind.annotation.RestController;import org.springframework.web.bind.annotation.RequestMapping;@RestControllerpublic class HelloController { @RequestMapping("/") public String index() { return "Greetings from Spring Boot!"; }}
這個類被註解為@RestController,這意味著Spring MVC可以使用它來處理web請求。@RequestMapping 映射 / 到 index()方法。當從瀏覽器調用或在命令行上使用curl時,該方法返回純文本。這是因為@RestController結合了@Controller和@ResponseBody,這兩個注釋導致了web請求返回數據而不是視圖。
創建一個Application類
這是如何創建一個帶有組件的 Application 類
src/main/java/hello/Application.java
package hello;import java.util.Arrays;import org.springframework.boot.CommandLineRunner;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.context.ApplicationContext;import org.springframework.context.annotation.Bean;@SpringBootApplicationpublic class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } @Bean public CommandLineRunner commandLineRunner(ApplicationContext ctx) { return args -> { System.out.println("Lets inspect the beans provided by Spring Boot:"); String[] beanNames = ctx.getBeanDefinitionNames(); Arrays.sort(beanNames); for (String beanName : beanNames) { System.out.println(beanName); } }; }}
@SpringBootApplication
是一個很方便的註解,它添加了以下所有內容:
@Configuration
註解表示應用程序上下文的bean定義的來源。@EnableAutoConfiguration
註解讓Spring Boot以類路徑設置、其他bean和各種屬性設置為基礎導入bean。- 一般情況下,你會為Spring MVC應用添加@EnableWebMvc ,但是Spring Boot在類路徑上看到spring-webmvc 時就會自動添加它。這會將應用程序標記為web應用程序,並激活諸如設置DispatcherServlet之類的關鍵行為。
@ComponentScan
讓Spring在hello包中尋找其他組件、配置和服務,並讓它能夠找到控制器。
main() 方法使用Spring Boot的SpringApplication.run()方法來啟動一個應用程序。您注意到沒有一行XML嗎?沒有web.xml文件。這個web應用程序是百分之百的純Java,您不需要處理任何額外的配置。
還有一個標記為@bean的CommandLineRunner方法,它在啟動時運行。它掃描所有由你的app創建的bean,或者是Spring Boot自動添加的。它把它們分類並列印出來。
運行應用
運行如下命令啟動應用
./gradlew build && java -jar build/libs/gs-spring-boot-0.1.0.jar
如果你用的是maven,使用如下命令
mvn package && java -jar target/gs-spring-boot-0.1.0.jar
您將會看到如下的輸出:
Lets inspect the beans provided by Spring Boot:applicationbeanNameHandlerMappingdefaultServletHandlerMappingdispatcherServletembeddedServletContainerCustomizerBeanPostProcessorhandlerExceptionResolverhelloControllerhttpRequestHandlerAdaptermessageSourcemvcContentNegotiationManagermvcConversionServicemvcValidatororg.springframework.boot.autoconfigure.MessageSourceAutoConfigurationorg.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfigurationorg.springframework.boot.autoconfigure.web.EmbeddedServletContainerAutoConfigurationorg.springframework.boot.autoconfigure.web.EmbeddedServletContainerAutoConfiguration$DispatcherServletConfigurationorg.springframework.boot.autoconfigure.web.EmbeddedServletContainerAutoConfiguration$EmbeddedTomcatorg.springframework.boot.autoconfigure.web.ServerPropertiesAutoConfigurationorg.springframework.boot.context.embedded.properties.ServerPropertiesorg.springframework.context.annotation.ConfigurationClassPostProcessor.enhancedConfigurationProcessororg.springframework.context.annotation.ConfigurationClassPostProcessor.importAwareProcessororg.springframework.context.annotation.internalAutowiredAnnotationProcessororg.springframework.context.annotation.internalCommonAnnotationProcessororg.springframework.context.annotation.internalConfigurationAnnotationProcessororg.springframework.context.annotation.internalRequiredAnnotationProcessororg.springframework.web.servlet.config.annotation.DelegatingWebMvcConfigurationpropertySourcesBinderpropertySourcesPlaceholderConfigurerrequestMappingHandlerAdapterrequestMappingHandlerMappingresourceHandlerMappingsimpleControllerHandlerAdaptertomcatEmbeddedServletContainerFactoryviewControllerHandlerMapping
你能很清楚的看到 org.springframework.boot.autoconfigure 這些beans.。同時也存在一個 tomcatEmbeddedServletContainerFactory
。
檢查一下這個服務。
$ curl localhost:8080Greetings from Spring Boot!
添加單元測試
您將希望為所添加的頁面添加一個測試,Spring Test已經提供了一些類庫,並且很容易包含在您的項目中。
將以下內容添加到構建文件的依賴項列表中:
testCompile("org.springframework.boot:spring-boot-starter-test")
如果你使用的是maven,添加如下項目
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency>
現在,編寫一個簡單的單元測試,該單元測試模擬servlet請求並通過頁面進行響應:
src/test/java/hello/HelloControllerTest.java
package hello;import static org.hamcrest.Matchers.equalTo;import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;import org.springframework.boot.test.context.SpringBootTest;import org.springframework.http.MediaType;import org.springframework.test.context.junit4.SpringRunner;import org.springframework.test.web.servlet.MockMvc;import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;@RunWith(SpringRunner.class)@SpringBootTest@AutoConfigureMockMvcpublic class HelloControllerTest { @Autowired private MockMvc mvc; @Test public void getHello() throws Exception { mvc.perform(MockMvcRequestBuilders.get("/").accept(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()) .andExpect(content().string(equalTo("Greetings from Spring Boot!"))); }}
MockMvc 來自Spring Test,它允許您通過一組方便的builder類向 DispatcherServlet 發送HTTP請求,並對結果作出斷言。請注意,@AutoConfigureMockMvc 與@SpringBootTest 需要一起注入一個MockMvc 實例。在使用@SpringBootTest 時候,我們需要創建整個應用程序上下文。另一種選擇是讓Spring Boot使用@WebMvcTest來創建上下文的web層。Spring Boot自動地嘗試在任何一種情況下定位應用程序的主應用程序類,但是如果您想要構建不同的東西,您可以重寫它,或者縮減它。
除了模擬HTTP請求之外,我們還可以使用Spring Boot來編寫一個非常簡單的全棧集成測試。例如,我們可以這樣做用來替代上面的模擬測試(或者一起使用):
src/test/java/hello/HelloControllerIT.javapackage hello;import static org.hamcrest.Matchers.*;import static org.junit.Assert.*;import java.net.URL;import org.junit.Before;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.context.SpringBootTest;import org.springframework.boot.test.web.client.TestRestTemplate;import org.springframework.boot.web.server.LocalServerPort;import org.springframework.http.ResponseEntity;import org.springframework.test.context.junit4.SpringRunner;@RunWith(SpringRunner.class)@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)public class HelloControllerIT { @LocalServerPort private int port; private URL base; @Autowired private TestRestTemplate template; @Before public void setUp() throws Exception { this.base = new URL("http://localhost:" + port + "/"); } @Test public void getHello() throws Exception { ResponseEntity<String> response = template.getForEntity(base.toString(), String.class); assertThat(response.getBody(), equalTo("Greetings from Spring Boot!")); }}
嵌入式伺服器會啟動一個隨機埠提供服務,只需要配置webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT,並且在運行時通過@LocalServerPort 發現這個隨機埠。
添加生產級別的服務
如果您正在為您的業務構建一個web站點,您可能需要添加一些管理服務。Spring Boot提供了幾個開箱即用的actuator模塊,比如健康檢測、審計、beans等等。
添加如下的依賴
compile("org.springframework.boot:spring-boot-starter-actuator")
如果你使用Maven
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
然後啟動應用
./gradlew build && java -jar build/libs/gs-spring-boot-0.1.0.jar
如果你使用Maven的話:
mvn package && java -jar target/gs-spring-boot-0.1.0.jar
您將會看到一組新的RESTful端點被添加到應用程序中。這些是Spring Boot提供的管理服務。
2014-06-03 13:23:28.119 ... : Mapped "{[/error],methods=[],params=[],headers=[],consumes...2014-06-03 13:23:28.119 ... : Mapped "{[/error],methods=[],params=[],headers=[],consumes...2014-06-03 13:23:28.136 ... : Mapped URL path [/**] onto handler of type [class org.spri...2014-06-03 13:23:28.136 ... : Mapped URL path [/webjars/**] onto handler of type [class ...2014-06-03 13:23:28.440 ... : Mapped "{[/info],methods=[GET],params=[],headers=[],consum...2014-06-03 13:23:28.441 ... : Mapped "{[/autoconfig],methods=[GET],params=[],headers=[],...2014-06-03 13:23:28.441 ... : Mapped "{[/mappings],methods=[GET],params=[],headers=[],co...2014-06-03 13:23:28.442 ... : Mapped "{[/trace],methods=[GET],params=[],headers=[],consu...2014-06-03 13:23:28.442 ... : Mapped "{[/env/{name:.*}],methods=[GET],params=[],headers=...2014-06-03 13:23:28.442 ... : Mapped "{[/env],methods=[GET],params=[],headers=[],consume...2014-06-03 13:23:28.443 ... : Mapped "{[/configprops],methods=[GET],params=[],headers=[]...2014-06-03 13:23:28.443 ... : Mapped "{[/metrics/{name:.*}],methods=[GET],params=[],head...2014-06-03 13:23:28.443 ... : Mapped "{[/metrics],methods=[GET],params=[],headers=[],con...2014-06-03 13:23:28.444 ... : Mapped "{[/health],methods=[GET],params=[],headers=[],cons...2014-06-03 13:23:28.444 ... : Mapped "{[/dump],methods=[GET],params=[],headers=[],consum...2014-06-03 13:23:28.445 ... : Mapped "{[/beans],methods=[GET],params=[],headers=[],consu...
他們包括: 錯誤檢測, 環境, 健康檢查, beans, 信息, 指標, 跟蹤, 配置屬性, and dump.
其中還包含一個/shutdown端點,但它在默認情況下僅通過JMX可見。為了使它成為一個HTTP端點,請添加endpoints.shutdown.enabled=true到你的application.properties 文件。
很容易的檢查一個app的健康狀況。
$ curl localhost:8080/health{"status":"UP","diskSpace":{"status":"UP","total":397635555328,"free":328389529600,"threshold":10485760}}}
您還可以嘗試通過curl來調用關機。
$ curl -X POST localhost:8080/shutdown{"timestamp":1401820343710,"error":"Method Not Allowed","status":405,"message":"Request method POST not supported"}
因為我們沒有啟用它,所以請求被阻止。有關這些REST點的詳細信息,以及如何使用應用程序調整它們的application.properties文件,您可以閱讀關於端點的詳細文檔。
查看Spring Boot的 starters
你已經看過一些Spring Boot的「啟動器」。您也可以在源代碼中查看它們。
JAR 支持和 Groovy 支持
最後一個示例展示了Spring Boot如何注入你無需關心但是需要的beans,並展示了如何開啟便捷的管理服務。
但是,Spring Boot提供了更多的功能。它不僅支持傳統的WAR文件部署,而且還可以通過Spring Boot的載入器模塊輕鬆地將可執行jar放在一起。你可以通過多個關於spring-boot-gradle-plugin和spring-boot-maven-plugin的指南來了解這種方法。
除此之外,Spring Boot也有Groovy支持,允許您構建Spring MVC web應用程序,只需一個文件即可。
創建一個名為app.groovy的新文件,並將下列代碼放入其中:
@RestController class ThisWillActuallyRun { @RequestMapping("/") String home() { return "Hello World!" } }
你不需要關心文件保存到了哪裡。你甚至可以在140個字中完成一個小應用程序!
接下來,安裝Spring Boot的CLI。
運行如下:
$ spring run app.groovy
這裡需要您關閉之前的應用程序以避免埠衝突。
從一個不同的終端窗口運行:
$ curl localhost:8080Hello World!
Spring Boot通過動態地向代碼添加關鍵注釋,並使用Groovy Grape來下載應用程序運行所需的庫來實現這一點。
概要
恭喜你!您使用Spring Boot構建了一個簡單的web應用程序,並學習了如何提高您的開發效率。您還打開了一些方便的生產級別的服務。這只是Spring Boot的一小部分功能。你可以查看在線文檔來更深入地了解Spring Boot。
參見
下面的指南可能也會有所幫助:
- 提高web應用的安全性
- 使用Spring WebMVC提供網路內容
推薦閱讀:
※除了「漢城」改名「首爾」之外,歷史上還有哪些官方譯名改變的事例(不限於地名)?
※不明白為什麼非得用第三方
※知乎機構賬號收集
TAG:SpringBoot | 翻譯 | 官方 |