spring boot入門教程——Spring Boot快速入門指南
Spring Boot已成為當今最流行的微服務開發框架,本文是如何使用Spring Boot快速開始Web微服務開發的指南,我們將使創建一個可運行的包含內嵌Web容器(默認使用的是Tomcat)的可運行Jar包。
傳統的Spring應用程序需要配置大量的XML文件才能運行,而使用Spring Boot只需極少的配置,就可以快速獲得一個正常運行的Spring應用程序,而這些配置使用的都是註解的形式,不需要再配置XML。
與Go語言的應用不同,我們知道所有的Java Web應用都必須放在servlet容器(不是像docker容器的那種容器),如Tomcat、Jetty等。Servlet容器被定位為托管web應用程序的高可用組件。
使用Java構建微服務並發布到Kubernetes平臺
Java作為多年的編程語言屆的No.1(使用人數最多,最流行),使用它來構建微服務的人也不計其數,Java的微服務框架Spring中的Spring Boot和Spring Cloud已成為當前最流行的微服務框架。
下面是Sping技術棧所包含的技術框架圖。
當然如果在Kubernetes中運行Java語言構建的微服務應用,我們不會使用上圖中所有的技術,本節將主要講解如何使用Spring Boot構建微服務應用。
Spring的基本原理
Spring是一套Java開發框架,框架的作用就是為了減少代碼的冗余和模塊之間的偶爾,使代碼邏輯更加清晰,主要是用了AOP(Aspect Oriented Programming,面向切面編程)和IoC(Inversion of Control,控制反轉)容器的思想,其中AOP是利用了Java的反射機制實現的。為了便於理解AOP可以參考一個簡單的Spring的AOP例子。
準備環境
在開始Spring Boot開發之前,需要先確認您的電腦上已經有以下環境:
- JDK8
- Maven3.0+
- Intellij IDEA
JDK最好使用JDK8版本,Maven和IDEA的安裝都十分簡單,Maven的倉庫配置有必要說一下。
配置Maven
在安裝好Maven之後,默認的~/.m2
目錄下是沒有maven倉庫配置文件settings.xml
的,默認使用的是官方的倉庫,訪問速度會非常慢,我們需要配置下國內的倉庫。
創建~/.m2/settings.xml
文件,文件內容如下:
1 <?xml version="1.0"?> 2 <settings> 3<mirrors> 4 <mirror> 5 <id>alimaven</id> 6 <name>aliyun maven</name> 7 <url>http://maven.aliyun.com/nexus/content/groups/public/</url> 8 <mirrorOf>central</mirrorOf> 9 </mirror> 10 </mirrors> 11 <profiles> 12 <profile> 13 <id>nexus</id> 14 <repositories> 15 <repository> 16 <id>nexus</id> 17 <name>local private nexus</name> 18 <url>http://maven.oschina.net/content/groups/public/</url> 19 <releases> 20 <enabled>true</enabled> 21 </releases> 22 <snapshots> 23 <enabled>false</enabled> 24 </snapshots> 25 </repository> 26 </repositories> 27 28 <pluginRepositories> 29 <pluginRepository> 30 <id>nexus</id> 31 <name>local private nexus</name> 32 <url>http://maven.oschina.net/content/groups/public/</url> 33 <releases> 34 <enabled>true</enabled> 35 </releases> 36 <snapshots> 37 <enabled>false</enabled> 38 </snapshots> 39 </pluginRepository> 40 </pluginRepositories> 41 </profile></profiles> 42 </settings>
其中使用的是阿裏雲的mirror,國內的下載速度非常快。
創建第一個Spring Boot應用
我們可以使用以下兩種方式創建Spring Boot應用:
- springboot
- maven
使用springboot命令創建Spring Boot應用
首先需要安裝springboot
命令行工具。
1 brew tap pivotal/tap 2 brew install springboot
使用下面的命令創建應用。
spring init --build maven --groupId com.example --version 0.0.1-SNAPSHOT --java-version 1.8 --dependencies web --name myproject myproject
--build
使用maven編譯或者是gradle--groupId
和--version
與maven的pom.xml
中的設置對應--dependencies
可以指定多個,如web
、jpa
、security
等starter
執行上述命令後,將創建如下的目錄結構:
1 . 2 └── myproject 3 ├── mvnw 4 ├── mvnw.cmd 5 ├── pom.xml 6 └── src 7 ├── main 8 │ ├── java 9 │ │ └── com 10 │ │ └── example 11 │ │ └── myproject 12 │ │ └── MyprojectApplication.java 13 │ └── resources 14 │ ├── application.properties 15 │ ├── static 16 │ └── templates 17 └── test 18 └── java 19 └── com 20 └── example 21 └── myproject 22 └── MyprojectApplicationTests.java 23 24 15 directories, 6 files
運行默認的示例應用。
1 mvn spring-boot:run
第一次運行需要下載依賴包所以會比較耗費時間,以後每次編譯運行速度就會很快。
在瀏覽器中訪問localhost:8080將看到如下輸出:
1 Whitelabel Error Page 2 This application has no explicit mapping for /error, so you are seeing this as a fallback. 3 4 Mon Mar 12 16:26:42 CST 2018 5 There was an unexpected error (type=Not Found, status=404). 6 No message available
使用Maven創建Spring Boot應用
使用Maven創建Spring Boot應用需要執行以下步驟:
- 創建Maven工程所需的
pom.xml
文件 - 生成Maven工程
- 編譯打包發布
創建pom.xml
為Maven項目構建創建pom.xml
文件,內容如下:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 3 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4 <modelVersion>4.0.0</modelVersion> 5 6 <groupId>com.example</groupId> 7 <artifactId>myproject</artifactId> 8 <version>0.0.1-SNAPSHOT</version> 9 10 <parent> 11 <groupId>org.springframework.boot</groupId> 12 <artifactId>spring-boot-starter-parent</artifactId> 13 <version>1.4.1.BUILD-SNAPSHOT</version> 14 </parent> 15 16 <repositories> 17 <repository> 18 <id>spring-snapshots</id> 19 <url>http://repo.spring.io/snapshot</url> 20 <snapshots><enabled>true</enabled></snapshots> 21 </repository> 22 <repository> 23 <id>spring-milestones</id> 24 <url>http://repo.spring.io/milestone</url> 25 </repository> 26 </repositories> 27 <pluginRepositories> 28 <pluginRepository> 29 <id>spring-snapshots</id> 30 <url>http://repo.spring.io/snapshot</url> 31 </pluginRepository> 32 <pluginRepository> 33 <id>spring-milestones</id> 34 <url>http://repo.spring.io/milestone</url> 35 </pluginRepository> 36 </pluginRepositories> 37 <!-- 添加classpath依賴 --> 38 <dependencies> 39 <dependency> 40 <groupId>org.springframework.boot</groupId> 41 <artifactId>spring-boot-starter-web</artifactId> 42 </dependency> 43 <!-- 開發者工具,當classpath下有文件更新自動觸發應用重啟 --> 44 <dependency> 45 <groupId>org.springframework.boot</groupId> 46 <artifactId>spring-boot-devtools</artifactId> 47 <optional>true</optional> 48 </dependency> 49 </dependencies> 50 <!-- maven編譯插件,用於創建可執行jar包 --> 51 <build> 52 <plugins> 53 <plugin> 54 <groupId>org.springframework.boot</groupId> 55 <artifactId>spring-boot-maven-plugin</artifactId> 56 </plugin> 57 </plugins> 58 </build> 59 </project>
現在執行mvn dependency:tree
可以看到項目中的依賴關系。
1 com.example:myproject:jar:0.0.1-SNAPSHOT 2 \- org.springframework.boot:spring-boot-starter-web:jar:1.4.1.BUILD-SNAPSHOT:compile 3 +- org.springframework.boot:spring-boot-starter:jar:1.4.1.BUILD-SNAPSHOT:compile 4 | +- org.springframework.boot:spring-boot:jar:1.4.1.BUILD-SNAPSHOT:compile 5 | +- org.springframework.boot:spring-boot-autoconfigure:jar:1.4.1.BUILD-SNAPSHOT:compile 6 | +- org.springframework.boot:spring-boot-starter-logging:jar:1.4.1.BUILD-SNAPSHOT:compile 7 | | +- ch.qos.logback:logback-classic:jar:1.1.7:compile 8 | | | +- ch.qos.logback:logback-core:jar:1.1.7:compile 9 | | | \- org.slf4j:slf4j-api:jar:1.7.21:compile 10 | | +- org.slf4j:jcl-over-slf4j:jar:1.7.21:compile 11 | | +- org.slf4j:jul-to-slf4j:jar:1.7.21:compile 12 | | \- org.slf4j:log4j-over-slf4j:jar:1.7.21:compile 13 | +- org.springframework:spring-core:jar:4.3.3.RELEASE:compile 14 | \- org.yaml:snakeyaml:jar:1.17:runtime 15 +- org.springframework.boot:spring-boot-starter-tomcat:jar:1.4.1.BUILD-SNAPSHOT:compile 16 | +- org.apache.tomcat.embed:tomcat-embed-core:jar:8.5.5:compile 17 | +- org.apache.tomcat.embed:tomcat-embed-el:jar:8.5.5:compile 18 | \- org.apache.tomcat.embed:tomcat-embed-websocket:jar:8.5.5:compile 19 +- org.hibernate:hibernate-validator:jar:5.2.4.Final:compile 20 | +- javax.validation:validation-api:jar:1.1.0.Final:compile 21 | +- org.jboss.logging:jboss-logging:jar:3.3.0.Final:compile 22 | \- com.fasterxml:classmate:jar:1.3.1:compile 23 +- com.fasterxml.jackson.core:jackson-databind:jar:2.8.3:compile 24 | +- com.fasterxml.jackson.core:jackson-annotations:jar:2.8.3:compile 25 | \- com.fasterxml.jackson.core:jackson-core:jar:2.8.3:compile 26 +- org.springframework:spring-web:jar:4.3.3.RELEASE:compile 27 | +- org.springframework:spring-aop:jar:4.3.3.RELEASE:compile 28 | +- org.springframework:spring-beans:jar:4.3.3.RELEASE:compile 29 | \- org.springframework:spring-context:jar:4.3.3.RELEASE:compile 30 \- org.springframework:spring-webmvc:jar:4.3.3.RELEASE:compile 31 \- org.springframework:spring-expression:jar:4.3.3.RELEASE:compile
這其中包括Tomcat web服務器和Spring Boot自身。
Spring Boot 推薦的基礎 POM 文件
所有這些 POM 依賴的好處在於為開發 Spring 應用提供了一個良好的基礎。Spring Boot 所選擇的第三方庫是經過考慮的,是比較適合產品開發的選擇。但是 Spring Boot 也提供了不同的選項,比如日誌框架可以用 Logback 或 Log4j,應用服務器可以用 Tomcat 或 Jetty。
生成Maven工程
對於普通的Java項目或者Java Web項目可以使用下面的命令創建maven結構:
mvn archetype:generate -DgroupId=com.example -DartifactId=myproject -DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false
下表是以上參數的使用說明:
這將生成以下的目錄結構:
1 . 2 └── myproject 3 ├── pom.xml 4 └── src 5 └── main 6 ├── resources 7 └── webapp 8 ├── WEB-INF 9 │ └── web.xml 10 └── index.jsp 11 12 6 directories, 3 files
對於Spring Boot項目,無法使用mvn
命令直接生成,需要手動創建目錄:
1 mkdir -p src/main/java
創建示例代碼
創建src/main/java/Example.java
文件內容如下:
1 import org.springframework.boot.*; 2 import org.springframework.boot.autoconfigure.*; 3 import org.springframework.stereotype.*; 4 import org.springframework.web.bind.annotation.*; 5 6 @RestController 7 @EnableAutoConfiguration 8 public class Example { 9 10 @RequestMapping("/") 11 String home() { 12 return "Hello World!"; 13 } 14 15 public static void main(String[] args) throws Exception { 16 SpringApplication.run(Example.class, args); 17 } 18 19 }
@RestController
註解告訴Spring以字符串的形式渲染結果,並直接返回給調用者。@EnableAutoConfiguration
註解告訴Spring Boot根據添加的jar依賴猜測你想如何配置Spring。由於spring-boot-starter-web
添加了Tomcat和Spring MVC,所以auto-configuration將假定你正在開發一個web應用,並對Spring進行相應地設置。@RequestMapping
註解提供路由信息,它告訴Spring任何來自”/“路徑的HTTP請求都應該被映射到home
方法。
註:@RestController
和@RequestMapping
是Spring MVC中的註解(它們不是Spring Boot的特定部分)。
編譯和發布
運行該項目有以下兩種方式。
方式1:直接mvn命令運行
1 mvn spring-boot:run
方式2:編譯打包成可執行jar包
1 mvn package 2 java -jar target/myproject-0.0.1-SNAPSHOT.jar
不論使用哪種方式編譯,訪問localhost:8080可以看到web頁面上顯示Hello world!
。
在target
目錄下,你應該還能看到一個很小的名為myproject-0.0.1-SNAPSHOT.jar.original
的文件,這是在Spring Boot重新打包前,Maven創建的原始jar文件。實際上可運行jar包中包含了這個小的jar包。
我有一個Java學習交流群:615741636,裏面有很多的幹貨教程,有我這幾年整理的Java學習手冊,面試題,開發工具和PDF文檔書籍,你可以自行去下載。
spring boot入門教程——Spring Boot快速入門指南