spring boot 原理、demo 與打包執行
Spring Boot的背景,我們為什麼要用它,它能給我們帶來什麼遍便利?
回首我們以前使用Spring框架的時候,我們需要首先在(如果你使用Maven的話)pom檔案中增加對相關的的依賴(使用gradle來構建的話基本也一樣)然後新建Spring相關的xml檔案,而且往往那些xml檔案還不會少。然後繼續使用tomcat或者jetty作為容器來執行這個工程。基本上每次建立一個新的專案都是這麼一個流程,而我們有時候僅僅想快速的建立一個Spring web工程來測試一些東西,或者是希望能節省時間。
現在我們使用Spring Boot就可以快速的做到這些了。spring boot可以直接把應用打包成為一個jar/war,然後這個jar/war是可以直接啟動的,不需要另外配置一個Web Server。
Spring boot 的理念:
從最根本上來講,Spring Boot就是一些庫的集合,它能夠被任意專案的構建系統所使用。簡便起見,該框架也提供了命令列介面,它可以用來執行和測試Boot應用。框架的釋出版本,包括整合的CLI(命令列介面),可以在Spring倉庫中手動下載和安裝。
實際中springboot將應用打包之後,會生成一個fat jar,裡面包含了應用依賴的jar包,還有Spring boot loader相關的類
Fat jar的啟動Main函式是JarLauncher,它負責建立一個LaunchedURLClassLoader來載入/lib下面的jar,並以一個新執行緒啟動應用的Main函式。LaunchedURLClassLoader和普通的URLClassLoader的不同之處是,它提供了從Archive里加載.class的能力。結合Archive提供的getEntries函式,就可以獲取到Archive裡的Resource。當然裡面的細節還是很多的。(詳細檢視原始碼)
Spring boot 實現?
Spring Boot 推薦採用基於 Java 註解的配置方式,而不是傳統的 XML。只需要在主配置 Java 類上新增“@EnableAutoConfiguration”註解就可以啟用自動配置。Spring Boot 的自動配置功能是沒有侵入性的,只是作為一種基本的預設實現。開發人員可以通過定義其他 bean 來替代自動配置所提供的功能。比如當應用中定義了自己的資料來源 bean 時,自動配置所提供的 HSQLDB 就不會生效。這給予了開發人員很大的靈活性。既可以快速的建立一個可以立即執行的原型應用,又可以不斷的修改和調整以適應應用開發在不同階段的需要。可能在應用最開始的時候,嵌入式的記憶體資料庫(如 HSQLDB)就足夠了,在後期則需要換成 MySQL 等資料庫。Spring Boot 使得這樣的切換變得很簡單。
@EnableAutoConfiguration”註解的作用在於讓 Spring Boot 根據應用所宣告的依賴來對 Spring 框架進行自動配置,這就減少了開發人員的工作量。@EnableAutoConfiguration註解會告知Boot要採用一種特定的方式來對應用進行配置。這種方法會將其他樣板式的配置均假設為框架預設的約定,因此能夠聚焦於如何儘快地使應用準備就緒以便執行起來。
Spring Boot 的這個配置優先順序看似複雜,其實是快速地修改配置引數值,而不需要重新打包和部署應用。
Spring boot的配置和使用:
1. 首先需要新建一個普通的maven 工程;
2. 要在pom.xml檔案中新增依賴如下
<projectxmlns="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.0http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>spingboot-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.0.0.RC1</version>
</parent>
<!-- Add typicaldependencies for a web application -->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>1.0.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>
<repositories>
<repository>
<id>spring-snapshots</id>
<url>http://repo.spring.io/libs-snapshot</url>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>spring-snapshots</id>
<url>http://repo.spring.io/libs-snapshot</url>
</pluginRepository>
</pluginRepositories>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
4.執行
第一種方式
通過在UserController中加上@EnableAutoConfiguration開啟自動配置,然後通過SpringApplication.run(UserController.class);執行這個控制器;這種方式只執行一個控制器比較方便;
程式碼如下:
@RestController
@EnableAutoConfiguration
public class Application {
@RequestMapping("user")
public static StringSayHello() {
return"Hello Word!";
}
public static voidmain(String[] args){
SpringApplication.run(Application.class,args);
}
}
第二種方式
通過@[email protected]開啟註解掃描並自動註冊相應的註解Bean
程式碼如下:
@Configuration
@ComponentScan
@EnableAutoConfiguration
public class Application {
public static voidmain(String[] args){
SpringApplication.run(Application.class,args);
}
將工程打包成獨立執行jar包
進入cmd 定位到專案目錄下然後執行 mvn clean package –DskipTests
然後會在專案的target資料夾下出現jar包例如(spingboot-demo-0.0.1-SNAPSHOT.jar)
然後再cmd 的C盤 使用者目錄下執行命令$ java –jar (jar包的目錄)E:\program\spingboot-demo\target\spingboot-demo-0.0.1-SNAPSHOT.jar
回車執行會有如下圖
出現下圖表示執行成功
然後在瀏覽器中輸入埠號和地址進行訪問。
這就立馬能夠明白spring boot 的優勢了,直接一個jar 包和java 環境就能執行web 專案了
遇到的問題:端口占用問題
執行獨立jar包時可能會出現端口占用問題,springboot的內嵌tomcat的埠是8080這個埠可能會被oracle (我就是)佔用或者 tomcat(預設8080)佔用所以我們要重新配置內嵌tomcat的埠號步驟如下
1. 在resource目錄下新建application.properties檔案(檔名一定要application.properties因為這個是預設的配置,如果檔名字不是這個則需要手動的新增識別)配置如下圖