如下內容,若有問題,煩請指出,謝謝html
springboot出來也好久了,之前零散地學習了很多,不過很長時間了都沒有在實際中使用過了,忘了很多,所以要最近準備抽時間系統的學習積累下springboot,給本身留個根。java
由於之前學過一些,這裏就主要根據官方文檔來學習了,可能會根據本身的理解來選擇一些知識點的學習順序。官方文檔地址:https://docs.spring.io/spring...git
官方文檔有十個大章節,第一章是綜述,就不用太細看了,這裏直接從第二章開始,也是介紹hello world的地方。
一開始就介紹了spring的四個目標:github
上面這四個也是普通spring程序的弊病,簡單來講就是入門門檻高了,spring的各類配置是很重要的,可是項目搭建後就不多管,而後新啓動一個項目又要花很長時間去配置,配置得仍是跟原來的差很少。web
系統要求就是jdk1.7/servlet3.0及以上,1.6版本如何使用能夠看很文檔後面的說明。官方內嵌支持三種servlet容器,最多見的tomcat,而後是jetty以及undertow(jboss默認的),tomcat是默認的,如何servlet容器替換後面會有內容講解。spring
第10小章是講解如何生成springboot的基礎項目,這個是給缺乏基礎的初學者看的,能夠不用太關注,若是想生成,能夠直接用https://start.spring.io/ 這個。數據庫
11小章開始正篇。
基礎的helloworld很簡單,先配置maven文件,強烈建議使用springboot提供的parent,不要本身一個個去單獨依賴,這個parent自己寫的比較好,能夠做爲不少項目的參考。若是你有必定的基礎,能夠不照着官方的started文檔的代碼來寫,自己這段代碼也比較少比較簡單。這裏我構造的項目結果以下,由於後續就主要用這個項目來學習springboot,所以就取名main,包名也儘可能作到規範
apache
具體代碼以下
pom.xml瀏覽器
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>pr.study.springboot</groupId> <artifactId>main</artifactId> <version>1.0.0</version> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.8.RELEASE</version> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
Main,javatomcat
package pr.study.springboot; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class Main { public static void main(String[] args) { SpringApplication.run(Main.class, args); } }
HelloWorldController.class
package pr.study.springboot.controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class HelloWorldController { @RequestMapping("/hello") public String hello() { return "hello world"; } }
幾點說明:
一、由於springboot-parent中的dependencies是使用dependencyManagement的形式,這種形式的依賴不會強制繼承,必須在子pom中顯式聲明纔會繼承,可是不用聲明版本,聲明瞭版本會提示一個warning。
二、繼承spring-boot-maven-plugin是爲了利用springboot的fat-jar打包功能,和dependency同樣,也是使用Management的形式,須要顯式聲明纔會依賴。
三、Main.class咱們編寫的代碼的啓動入口類,使用spring-boot-maven-plugin打包成jar並用java -jar啓動時,這個類並非真正應用程序入口類Main-Class。
四、官方的代碼中controller和main函數寫在一個類中,所以能夠不須要SpringBootApplication這個註解,寫在不一樣的類中就須要這個註解,不然掃描不到controller。經過源碼能夠知道@SpringBootApplication = @SpringBootConfiguration + @EnableAutoConfiguration + @ComponentScan,它具備ComponentScan的做用,所以不須要像spring程序那樣顯式指定包掃描.
五、@EnableAutoConfiguration,這個註解後面表明的一系列功能是springboot的核心之一,自動配置,這個註解解決了不少配置問題。他的基本原理就是經過你的maven依賴來猜出你須要注入那些bean,它會幫你啓動相關配置並注入這個bean。這裏咱們依賴了spring-boot-starter-web,它就會幫咱們開啓springmvc相關的配置並自動注入相關的必須的bean。由於會自動配置並注入,因此springboot程序的依賴管理很重要沒用的依賴儘可能都去掉,特別是那些數據庫相關的依賴。關於springboot的自動配置,這個是重點之一,後面細說。
六、@RestController = @Controller + @@ResponseBody,也是一個複合註解,減小代碼量,相似的還有@GetMapping、@PostMapping等等。
上面這六點,1-3能夠經過maven相關的知識更進一步瞭解,具體就是maven依賴管理以及maven打包,本人沒有系統的學習,知識簡單瞭解,因此這裏就不細說了。4-6在後續的springboot學習中會慢慢學習到。
運行程序能夠直接在Main上運行java application做爲普通java程序運行,這時候Main中的main函數就是真正的啓動函數。這裏是使用嵌入式tomcat做爲servlet容器來運行servlet程序,因此並不須要咱們部署到tomcat。
紅色標記的就是已經掃描到了並初始化成功了HelloWorldController。
打開瀏覽器請求 http://localhost:8080/hello 能夠看到運行結果
若是運行出現這種問題
The Bean Validation API is on the classpath but no implementation could be found
那麼請刪除下springboot相關的本地jar包,有時候jar包下載會抽風。自己springmvc裏面是依賴有hibernate-validator做爲參數校驗的(@Valid @Validated使用),是不該該出現這個問題的。
若是你想打包部署,由於引用了spring-boot-maven-plugin,因此直接運行 mvn clean package就能夠打包,最後打包的target是一個fat-jar,也就是包含了全部依賴的可運行jar包。
打包好後,在路徑下命令行輸入 java -jar main-1.0.0.jar 就能夠啓動
你能夠把 java -jar main-1.0.0.jar 寫到腳本文件sh or bat中,這樣就能夠做爲一個簡單的啓動腳本,而後和jar一塊兒發送到目標機器上,運行啓動腳本啓動程序,這樣就差很少就算是完成了一次簡單的springboot程序的部署發佈。
把這個打包好的jar解壓下,簡單看下結構
BOOT-INF是應用程序的主體,classes下面的就是咱們的寫的代碼,lib裏面的就是是咱們的程序依賴的jar包
META-INF是一些基礎數據,其中比較重要的就是MANIFEST.MF
Manifest-Version: 1.0 Implementation-Title: main Implementation-Version: 1.0.0 Archiver-Version: Plexus Archiver Built-By: pengrui Implementation-Vendor-Id: pr.study.springboot Spring-Boot-Version: 1.5.8.RELEASE Implementation-Vendor: Pivotal Software, Inc. Main-Class: org.springframework.boot.loader.JarLauncher Start-Class: pr.study.springboot.Main Spring-Boot-Classes: BOOT-INF/classes/ Spring-Boot-Lib: BOOT-INF/lib/ Created-By: Apache Maven 3.3.9 Build-Jdk: 1.8.0_111 Implementation-URL: http://projects.spring.io/spring-boot/main/
這個文件描述了jar的基本結構
關於JarLauncher以及org.springframework.boot.loader.*裏面的內容,我尚未研究過,這個後續再細說。
到這裏,一個簡單的springboot程序的編碼、本地測試運行、打包、啓動就都簡單過了一遍,後面再一個個補充豐滿。
代碼相關:
https://gitee.com/page12/stud...
https://github.com/page12/stu...