快速揭開SpringBoot面紗——熵增小講堂

快速揭開SpringBoot面紗——熵增小講堂

快速揭開SpringBoot面紗

本文將按照Spring Boot官方文檔“II. Getting Started”,從實例的角度,一步步地搭建出一個 Spring Boot 應用,讓你能快速的入門 Spring Boot 2.x。

介紹Spring Boot

SpringBoot 官方文檔介紹如下:

你可以使用Spring Boot創建Java應用,並使用java -jar啟動它或採用傳統的war部署方式。我們也提供了一個運行"spring腳本"的命令行工具。

我們主要的目標是:

  • 為所有Spring開發提供一個從根本上更快,且隨處可得的入門體驗。
  • 開箱即用,但通過不採用默認設置可以快速擺脫這種方式。
  • 提供一系列大型項目常用的非功能性特徵,比如:內嵌服務器,安全,指標,健康檢測,外部化配置。
  • 絕對沒有代碼生成,也不需要XML配置。

熵增學院總結如下:

隨著新技術的發展,腳本語言大行其道的時代(Node JS,Golang,Python,Scala等),Java EE使用Spring逐漸變得笨重起來,大量的XML文件存在與項目中,繁瑣的配置,整合第三方框架的配置問題,低下的開發效率和部署效率等等問題。

這些問題在不斷的社區反饋下,Spring團隊也開發出了相應的框架:Spring Boot。Spring Boot可以說是至少近5年來Spring乃至整個Java社區最有影響力的項目之一,也被人看作是:Java EE開發的顛覆者

Spring Boot解決的問題

(1) Spring Boot使編碼變簡單

(2) Spring Boot使配置變簡單

(3) Spring Boot使部署變簡單

(4) Spring Boot使監控變簡單

Spring Boot為我們帶來了腳本語言開發的效率,但是Spring Boot並沒有讓我們意外的新技術,都是Java EE開發者常見的技術。

環境要求

  • JAVA 8 及 以上
  • Maven 3.2 及 以上
  • Servlet 3.1 及以上

快速初始化

使用Spring Initializr 初始化

  1. 訪問 https://start.spring.io/ 網站
  2. 輸入group 和 artifact,以及所需要的依賴
  3. 生成project 並下載使用
  4. 將下載的maven項目導入到IDE中(eclipse, idea, netbeans)

使用Intellj Idea 進行初始化

  1. new module , 選擇 Spring Initializr
  2. 輸入group 和 artifact,點擊 next
  3. 勾選需要的依賴,然後next
  4. 生成spring boot項目

快速編寫代碼

pom文件


	4.0.0
	com.example
	demo
	0.0.1-SNAPSHOT
	jar
	demo
	Demo project for Spring Boot
	
		org.springframework.boot
		spring-boot-starter-parent
		2.0.5.RELEASE
		  
	
	
		UTF-8
		UTF-8
		1.8
	
	
		
			org.springframework.boot
			spring-boot-starter-web
		
		
			org.springframework.boot
			spring-boot-starter-test
			test
		
	
	
		
			
				org.springframework.boot
				spring-boot-maven-plugin
			
		
	

JAVA代碼

代碼路徑:src/main/java/Example.java

import org.springframework.boot.*;
import org.springframework.boot.autoconfigure.*;
import org.springframework.web.bind.annotation.*;
@RestController
@EnableAutoConfiguration
public class Example {
	@RequestMapping("/")
	String home() {
		return "Hello World!";
	}
	public static void main(String[] args) throws Exception {
		SpringApplication.run(Example.class, args);
	}
}

運行Spring Boot

在IDE中運行

如果你是使用intellj idea或者eclipse, 可以直接右鍵 run as application即可

使用maven運營

在當前目錄執行 mvn spring-boot:run

輸出如下

 . ____ _ __ _ _
 /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/ ___)| |_)| | | | | || (_| | ) ) ) )
 ' |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot :: (v2.0.5.RELEASE)
2018-10-05 15:03:03.236 INFO 9316 --- [ main] com.example.demo.DemoApplication : Starting DemoApplication on DESKTOP-8IEBQSU with PID 9316 (F:\demo\target\classes started by anders in E:\codespace\idea\smartblog)
2018-10-05 15:03:03.239 INFO 9316 --- [ main] com.example.demo.DemoApplication : No active profile set, falling back to default profiles: default
2018-10-05 15:03:03.298 INFO 9316 --- [ main] ConfigServletWebServerApplicationContext : Refreshing org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@5d47c63f: startup date [Fri Oct 05 15:03:03 CST 2018]; root of context hierarchy
2018-10-05 15:03:05.354 INFO 9316 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http)
2018-10-05 15:03:05.402 INFO 9316 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2018-10-05 15:03:05.403 INFO 9316 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet Engine: Apache Tomcat/8.5.34
2018-10-05 15:03:05.424 INFO 9316 --- [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: [D:\programsoft\java8\bin;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS;D:\install-file\oracle\server\bin;C:\ProgramData\Oracle\Java\javapath;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;D:\programsoft\git\Git\cmd;D:\programsoft\git\Git\mingw64\bin;D:\programsoft\git\Git\usr\bin;C:\Program Files\MySQL\MySQL Utilities 1.6\;D:\programsoft\tortoisesvn\bin;C:\Program Files\nodejs\;C:\WINDOWS\System32\OpenSSH\;D:\developRepository\nodeModule;C:\Users\anders\AppData\Local\Microsoft\WindowsApps;C:\Users\anders\AppData\Roaming\npm;;D:\programsoft\Microsoft VS Code\bin;.]
2018-10-05 15:03:05.686 INFO 9316 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2018-10-05 15:03:05.686 INFO 9316 --- [ost-startStop-1] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 2391 ms
2018-10-05 15:03:05.739 INFO 9316 --- [ost-startStop-1] o.s.b.w.servlet.ServletRegistrationBean : Servlet dispatcherServlet mapped to [/]
2018-10-05 15:03:05.742 INFO 9316 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'characterEncodingFilter' to: [/*]
2018-10-05 15:03:05.742 INFO 9316 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'hiddenHttpMethodFilter' to: [/*]
2018-10-05 15:03:05.742 INFO 9316 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'httpPutFormContentFilter' to: [/*]
2018-10-05 15:03:05.742 INFO 9316 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'requestContextFilter' to: [/*]
2018-10-05 15:03:05.838 INFO 9316 --- [ main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/**/favicon.ico] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2018-10-05 15:03:06.002 INFO 9316 --- [ main] s.w.s.m.m.a.RequestMappingHandlerAdapter : Looking for @ControllerAdvice: org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@5d47c63f: startup date [Fri Oct 05 15:03:03 CST 2018]; root of context hierarchy
2018-10-05 15:03:06.075 INFO 9316 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/]}" onto java.lang.String com.example.demo.DemoApplication.home()
2018-10-05 15:03:06.078 INFO 9316 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error]}" onto public org.springframework.http.ResponseEntity> org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController.error(javax.servlet.http.HttpServletRequest)
2018-10-05 15:03:06.079 INFO 9316 --- [ 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-10-05 15:03:06.102 INFO 9316 --- [ main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2018-10-05 15:03:06.102 INFO 9316 --- [ main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2018-10-05 15:03:06.237 INFO 9316 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Registering beans for JMX exposure on startup
2018-10-05 15:03:06.405 INFO 9316 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''
2018-10-05 15:03:06.408 INFO 9316 --- [ main] com.example.demo.DemoApplication : Started DemoApplication in 3.479 seconds (JVM running for 3.968)
2018-10-05 15:03:09.561 INFO 9316 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring FrameworkServlet 'dispatcherServlet'
2018-10-05 15:03:09.561 INFO 9316 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : FrameworkServlet 'dispatcherServlet': initialization started
2018-10-05 15:03:09.587 INFO 9316 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : FrameworkServlet 'dispatcherServlet': initialization completed in 26 ms

可執行的jar文件

傳統的方式,運行SSM項目必須將項目打成war包,然後將war包放到servlet容器(tomcat, jetty, weblogic等)中才能執行。

而Spring Boot採取了一個不同的方式,直接將所有的依賴,包括servlet依賴都打到了一個jar文件中,然後可以直接運行 java -jar 命令來執行

打成jar包

在項目pom.xml文件目錄,執行 mvn package 命令來進行打包

$ mvn package
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building myproject 0.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] .... ..
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ myproject ---
[INFO] Building jar: /Users/developer/example/spring-boot-example/target/myproject-0.0.1-SNAPSHOT.jar
[INFO]
[INFO] --- spring-boot-maven-plugin:2.0.5.RELEASE:repackage (default) @ myproject ---
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------

如果查看target目錄,你應該可以看到myproject-0.0.1-SNAPSHOT.jar,該文件大概有10Mb

執行jar文件

在target目錄,執行 java -jar命令運行該應用程序:

$ java -jar target/myproject-0.0.1-SNAPSHOT.jar
 . ____ _ __ _ _
 /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/ ___)| |_)| | | | | || (_| | ) ) ) )
 ' |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot :: (v2.0.5.RELEASE)
....... . . .
....... . . . (log output here)
....... . . .
........ Started Example in 2.536 seconds (JVM running for 2.864)

後記

本節教程只是帶著大家初步感受一下SpringBoot項目,它很快,很精簡,零配置,大大的簡化了Spring項目的配置。而當前這個“腳本語言大行其道”的時代,SpringBoot的到來無疑給我們帶來了腳本語言的開發效率。

比如當下較火的nodejs、golang、python等腳本語言,都內置了net/http庫,所以這些腳本語言配置極其簡單。

比如nodeje 的koa2配置如下:

const Koa = require('koa')
const app = new Koa()
app.use( async ( ctx ) => {
 ctx.body = 'hello koa2'
})
app.listen(3000)

再比如python的flask 如下:

from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
 return 'Hello World!'
if __name__ == '__main__':
 app.run()

以上腳本語言不超過幾行代碼就可以啟動一個web應用,

而java並沒有內置http庫,所以需要servlet容器來實現http庫,而springboot的誕生,徹底解決了java 這一痛點,使用java開發也可以像腳本語言那樣簡單。

未來5年之內,springboot會依舊大火,無論小項目,中型項目、微服務項目都有Springboot的王者角色!

2019年最新java入門到架構,資源整合大禮包私信“學習”即可領取哦~

一線架構師整理全套學習視頻和資料,都在這裡等你!


分享到:


相關文章: