簡單說, spring boot 是一個構建項目的工具, 一個腳手架.html
spring boot 作很是少的配置就能夠構建生產級別的單體應用.java
下面讓咱們來用spring boot 作一個hello world.react
環境準備, 須要保證你的機器上已經有了以下軟件git
建立項目目錄, 假設這個新的項目叫apple
.github
$ cd /tmp $ mkdir apple
建立gradle配置文件,在這個目錄下建立build.gradle
文件.web
$ cd apple $ vi build.gradle
將以下代碼複製到build.gradle
文件中.spring
plugins { id 'org.springframework.boot' version '2.0.1.RELEASE' } apply plugin: 'java' apply plugin: 'io.spring.dependency-management' repositories { mavenCentral() } dependencies { compile 'org.springframework.boot:spring-boot-starter-web' testCompile 'org.springframework.boot:spring-boot-starter-test' testCompile 'org.springframework.boot:spring-boot-starter-webflux' } bootRun { main = 'com.thoughtworks.apple.Launcher' }
寫一個Hello world.apache
apple \-src \-main \-java \-com.thoughtworks.apple |-controller | \-HomeController.java \-Launcher.java
package com.thoughtworks.apple.controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class HomeController { @RequestMapping("/") String home() { return "Hello World!"; } }
package com.thoughtworks.apple; import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringBootConfiguration; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.context.annotation.ComponentScan; @SpringBootConfiguration @EnableAutoConfiguration @ComponentScan("com.thoughtworks.apple") public class Launcher { public static void main(String[] args) { SpringApplication.run(Launcher.class, args); } }
運行瀏覽器
執行命令gradle bootRun
啓動應用,以後會打印以下日誌:tomcat
$ gradle bootRun > Task :bootRun . ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v2.0.1.RELEASE) 2018-05-05 10:23:41.383 INFO 38941 --- [ main] com.thoughtworks.apple.Launcher : Starting Launcher on CNyfqi.local with PID 38941 (/private/tmp/apple/build/classes/java/main started by yfqi in /private/tmp/apple) 2018-05-05 10:23:41.386 INFO 38941 --- [ main] com.thoughtworks.apple.Launcher : No active profile set, falling back to default profiles: default 2018-05-05 10:23:41.432 INFO 38941 --- [ main] ConfigServletWebServerApplicationContext : Refreshing org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@3b2c72c2: startup date [Sat May 05 10:23:41 CST 2018]; root of context hierarchy 2018-05-05 10:23:42.289 INFO 38941 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http) 2018-05-05 10:23:42.313 INFO 38941 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat] 2018-05-05 10:23:42.313 INFO 38941 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet Engine: Apache Tomcat/8.5.29 2018-05-05 10:23:42.323 INFO 38941 --- [ost-startStop-1] o.a.catalina.core.AprLifecycleListener : The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: [/Users/yfqi/Library/Java/Extensions:/Library/Java/Extensions:/Network/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java:.] 2018-05-05 10:23:42.402 INFO 38941 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext 2018-05-05 10:23:42.403 INFO 38941 --- [ost-startStop-1] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 973 ms 2018-05-05 10:23:42.522 INFO 38941 --- [ost-startStop-1] o.s.b.w.servlet.ServletRegistrationBean : Servlet dispatcherServlet mapped to [/] 2018-05-05 10:23:42.525 INFO 38941 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'characterEncodingFilter' to: [/*] 2018-05-05 10:23:42.526 INFO 38941 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'hiddenHttpMethodFilter' to: [/*] 2018-05-05 10:23:42.526 INFO 38941 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'httpPutFormContentFilter' to: [/*] 2018-05-05 10:23:42.526 INFO 38941 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'requestContextFilter' to: [/*] 2018-05-05 10:23:42.627 INFO 38941 --- [ main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/**/favicon.ico] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler] 2018-05-05 10:23:42.809 INFO 38941 --- [ main] s.w.s.m.m.a.RequestMappingHandlerAdapter : Looking for @ControllerAdvice: org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@3b2c72c2: startup date [Sat May 05 10:23:41 CST 2018]; root of context hierarchy 2018-05-05 10:23:42.878 INFO 38941 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/]}" onto java.lang.String com.thoughtworks.apple.controller.HomeController.home() 2018-05-05 10:23:42.884 INFO 38941 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error]}" onto public org.springframework.http.ResponseEntity<java.util.Map<java.lang.String, java.lang.Object>> org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController.error(javax.servlet.http.HttpServletRequest) 2018-05-05 10:23:42.885 INFO 38941 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error],produces=[text/html]}" onto public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse) 2018-05-05 10:23:42.910 INFO 38941 --- [ main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler] 2018-05-05 10:23:42.910 INFO 38941 --- [ main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler] 2018-05-05 10:23:43.048 INFO 38941 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Registering beans for JMX exposure on startup 2018-05-05 10:23:43.100 INFO 38941 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path '' 2018-05-05 10:23:43.105 INFO 38941 --- [ main] com.thoughtworks.apple.Launcher : Started Launcher in 2.148 seconds (JVM running for 2.523) 2018-05-05 10:24:03.416 INFO 38941 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring FrameworkServlet 'dispatcherServlet' 2018-05-05 10:24:03.416 INFO 38941 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : FrameworkServlet 'dispatcherServlet': initialization started 2018-05-05 10:24:03.436 INFO 38941 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : FrameworkServlet 'dispatcherServlet': initialization completed in 20 ms <=========----> 75% EXECUTING [1m 28s] > :bootRun
以後在瀏覽器中訪問http://localhost:8080/
能看到以下頁面說明程序運行成功了.
當咱們本地有多個項目, 且每一個項目的gradle版本不同時, 咱們就須要把gradle命令保存在項目內, 而後每一個項目用本身的gradle來構建. 下面這個命令能夠直接初始化引入一個gradle命令到項目內部.
$ gradle wrapper --gradle-version 4.0
以後項目目錄下會多出四個文件
drwxr-xr-x 4 yfqi wheel 128 May 5 10:49 .gradle drwxr-xr-x 3 yfqi wheel 96 May 5 10:49 gradle -rwxr-xr-x 1 yfqi wheel 5296 May 5 10:49 gradlew -rw-r--r-- 1 yfqi wheel 2260 May 5 10:49 gradlew.bat
之後就能夠在項目根目錄下執行 ./gradlew
來運行gradle的tasks了.
程序成功運行了, 讓咱們來寫一個測試用例測試一下hello world.
測試目錄結構以下
apple \-src |-main \-test \-java \-com.thoughtworks.apple.controller \-HomeControllerTest.java
HomeControllerTest.java內容以下
package com.thoughtworks.apple.controller; 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.test.context.junit4.SpringRunner; import org.springframework.test.web.reactive.server.WebTestClient; @RunWith(SpringRunner.class) @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) public class HomeControllerTest { @Autowired private WebTestClient webClient; @Test public void should_get_home() { this.webClient.get().uri("/").exchange() .expectStatus().isOk() .expectBody(String.class).isEqualTo("Hello World!"); } }
運行測試使用命令./gradlew test
能看到以下日誌說明測試執行成功
$ gradle test Starting a Gradle Daemon (subsequent builds will be faster) > Task :test 2018-05-05 10:36:18.034 INFO 39291 --- [ Thread-6] ConfigServletWebServerApplicationContext : Closing org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@918accb: startup date [Sat May 05 10:36:15 CST 2018]; root of context hierarchy BUILD SUCCESSFUL in 12s 3 actionable tasks: 3 executed
./grdlew bootJar
來打包spring boot項目. 命令執行成功後會在apple/build/libs
下多出一個jar包apple.jar
.這就打包成功了.java -jar apple.jar &
就能夠把應用啓動起來.上面的例子你們會發現項目只是依賴了三個Spring Boot的Starter就完成了對全部第三方jar包的引用.Starter其實就是對第三方jar包依賴按照業務須要作了一個聚合,Spring Boot提供了大量的Starter來幫助開發人員快速開始構建項目, 下降了開發人員調包依賴的工做量.在這兩個地址能夠查看Spring Boot的全部的Starters.
文章的完整代碼能夠在這裏找到: https://github.com/qyf404/learning-spring-boot