快速揭開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 初始化
- 訪問 https://start.spring.io/ 網站
- 輸入group 和 artifact,以及所需要的依賴
- 生成project 並下載使用
- 將下載的maven項目導入到IDE中(eclipse, idea, netbeans)
使用Intellj Idea 進行初始化
- new module , 選擇 Spring Initializr
- 輸入group 和 artifact,點擊 next
- 勾選需要的依賴,然後next
- 生成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入門到架構,資源整合大禮包私信“學習”即可領取哦~
一線架構師整理全套學習視頻和資料,都在這裡等你!