SpringBoot的基本使用
1、Springboot的基本介紹
SpringBoot提供了一種快速使用Spring的方式,基于約定優于配置的思想,可以讓開發人員不必在配置與邏 輯業務之間進行思維的切換,全身心的投入到邏輯業務的代碼編寫中,從而大大提高了開發的效率,一定程度 上縮短了項目周期。2014 年 4 月,Spring Boot 1.0.0 發布。
在介紹 springboot 時,我們先介紹一下 Spring,Spring是于2003 年興起的一個輕量級的Java 開源框架,Spring 框架功能很強大,但是就算是一個很簡單的項目,我們也要配置很多東西。spring 的缺點:配置繁瑣、依賴繁瑣。
因此就有了Spring Boot框架,它的作用很簡單,就是幫我們自動配置。Spring Boot 以約定大于配置的核心思想,默認幫我們進行了很多設置,多數 Spring Boot 應用只需要很少的 Spring 配置。同時它集成了大量常用的第三方庫配置(例如 Redis、MongoDB、Jpa、RabbitMQ、Quartz 等等),Spring Boot 應用中這些第三方庫幾乎可以零配置的開箱即用。
Spring Boot框架的核心就是自動配置,只要存在相應的jar包,Spring就幫我們自動配置。如果默認配置不能滿足需求,我們還可以替換掉自動配置類,使用我們自己的配置。另外,Spring Boot還集成了嵌入式的Web服務器,系統監控等很多有用的功,讓我們快速構建企業及應用程序。另外SpringBoot通過集成大量的框架使得依賴包的版本沖突,以及引用的不穩定性等問題得到了很好的解決。
Spring Boot的主要優點:
- 為所有Spring開發者更快的入門
- 開箱即用,提供各種默認配置來簡化項目配置
- 內嵌式容器簡化Web項目
- 沒有冗余代碼生成和XML配置的要求
Spring Boot 并不是對 Spring 功能上的增強,而是提供了一種快速使用 Spring 的方式。
1.1、SpringBoot的四大特性
- SpringBoot Starter:他將常用的依賴分組進行了整合,將其合并到一個依賴中,這樣就可以一次性添加到項目的Maven或Gradle構建中;
- 自動配置:SpringBoot的自動配置特性利用了Spring4對條件化配置的支持,合理地推測應用所需的bean并自動化配置他們;
- 命令行接口:(Command-line-interface, CLI):SpringBoot的CLI發揮了Groovy編程語言的優勢,并結合自動配置進一步簡化Spring應用的開發;
- Actuatir:它為SpringBoot應用的所有特性構建一個小型的應用程序。但首先,我們快速了解每項特性,更好的體驗他們如何簡化Spring編程模型。
1.2、使用 Springboot 的好處
回顧我們之前的 SSM 項目,搭建過程還是比較繁瑣的,需要:1、配置web.xml,加載spring和spring mvc。2、配置數據庫連接、配置spring事務。3、配置加載配置文件的讀取,開啟注解。。。配置完成之后部署tomcat 調試。
而使用 Spring Boot 來開發項目則只需要非常少的幾個配置就可以搭建起來一個 Web 項目,并且利用 IDEA 可以自動生成生成,
2、使用springboot
springboot 對系統的要求:Java 8 & 兼容java14,Maven 3.3+ 。
2.1、基于maven空模板創建springboot項目
下面示例的最終目錄結構:

先通過 IDEA 建立一個簡單的 maven 工程,不需要使用任何 maven 模板,然后添加依賴:
<?xml version="1.0" encoding="UTF-8"?> <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>org.example</groupId> <artifactId>springbootTest01</artifactId> <version>1.0-SNAPSHOT</version> <!-- 所有的springboot的工程都以spring父工程為父工程 --> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.6.RELEASE</version> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies> </project>
建一個 springboot 啟動類:
package start; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class SpringbootStartApplication { public static void main(String[] args) { SpringApplication.run(SpringbootStartApplication.class, args); } }
所有的springboot application啟動類都需要在類級別上加上@SpringBootApplication注解。
在啟動類的當前包或者子包下建一個測試 controller 類:
package start.controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class HelloController { @RequestMapping("/hello") public String handle01(){ return "Hello, Spring Boot 2!"; } }
注意,springboot 默認掃描的的類是在啟動類當前的包和下級包,所以如果 controller 類不在啟動類的當前包或者子包下,則該組件無法被掃描出來。
然后直接執行啟動類的 main 方法即可。
在輸出日志中可以看到已經啟動了內嵌的 tomcat ,并且默認端口號為 8080。

通過訪問 http://localhost:8080/hello 可以看到上面接口的輸出:

springboot 集成了Tomcat和Jetty,默認使用Tomcat作為應用容器,開發者只需要將工程打成jar包直接丟到服務器上就可以執行了,不需要再單獨部署到was、jboss、tomcat這些應用服務器上。
2.2、基于Spring Initializr創建springboot項目
Spring官方提供了非常方便的工具 Spring Initializr 讓我們快速構建應用,可以通過 IDEA 或者官網來使用該工具創建springboot項目。
2.2.1、通過 IDEA創建項目
我們可以通過 IDEA 創建 springboot 項目,在創建項目時選擇 spring initializr:

然后填寫項目基本信息:

在下一步勾選 web,選中 spring web即可:

初始化項目目錄結構如下:

通過運行 SpringbootdemoApplication 類的 main 方法即可啟動 springboot,然后就可以通過瀏覽器訪問 http://localhost:8080/ 來訪問項目了。
有一些無用的文件可以直接刪掉,比如 .mvn、mvnw、mvnw.cmd 這些。
有時候通過IDEA創建項目可能比較慢,而且可能連接超時,此時我們可以在官網來創建初始化項目。
2.2.2、通過官網創建項目
我們可以通過訪問官方網站來創建一個初始化項目,然后再將該項目拷貝下來進行修改。
- 打開 https://start.spring.io/
- 填寫項目信息,記得在右邊添加spring web依賴
- 點擊”Generate Project“按鈕即可生成項目
類似下圖:

2.3、打包并運行 springboot項目
參考:https://www.liaoxuefeng.com/wiki/1252599548343744/1282386595676193
3、起步依賴原理
從 springboot 項目中可以看到,所有的 springboot 項目都依賴一個父項目 spring-boot-starter-parent,主要是管理項目的資源過濾及插件。

從該父項目點進去,你會發現該父項目里面還有一個父依賴 spring-boot-dependencies,如下:

再點進去 spring-boot-dependencies,可以看到該項目的管理著的所有依賴的版本,如下:

實際上,這里的 spring-boot-dependencies 才是真正管理 SpringBoot 應用里面所有依賴的版本的地方,是 SpringBoot 的版本控制中心。該項目中的 <dependencyManagement> 標簽里定義了各種可能用到的依賴的版本,所以在 springboot 項目里使用這些依賴時默認是不需要寫版本,默認會直接使用 spring-boot-dependencies 里面所定義的版本。
比如,springboot 項目里面引入了 spring-boot-starter-web 依賴,如下:

此時,它是不需要寫版本的,直接會默認使用 spring-boot-dependencies 里面所定義的版本,我們在 spring-boot-dependencies 里面可以找到 spring-boot-starter-web 依賴的版本號的。
但是需注意,spring-boot-dependencies 中 <dependencyManagement> 標簽里定義的依賴是不會被 springboot 項目直接繼承的,要想使用這些依賴仍需顯式引入,只不過無需寫具體版本號而已。
springboot 實際引入的依賴,我們可以在它所引入的 spring-boot-starter-web 依賴中看到,如下在進入到 spring-boot-starter-web 后可以看到所用到的依賴:

4、啟動器
springboot-boot-starter-xxx 就是spring-boot的某個場景的啟動器。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
如上,spring-boot-starter-web 啟動器就幫我們導入了web模塊正常運行所依賴的組件。
SpringBoot 將所有的功能場景都抽取出來,做成一個個的 starter (啟動器),只需要在項目中引入這些 starter 即可,所有相關的依賴都會導入進來 , 我們要用什么功能就導入什么樣的場景啟動器即可 ;我們未來也可以自己自定義 starter。
5、自定義配置文件
SpringBoot 是基于約定的,所以很多配置都有默認值,Spring Boot在底層已經把所需要的配置都給我們自動配置好了,但如果想使用自己的配置替換默認配置的話,可以使用 application.properties或者application.yml(application.yaml)進行配置。
springboot 配置文件的文件名是固定的:application.properties 或者是 application.yml(后綴也可以寫成 yaml),兩種文件本質是一樣的,區別只是兩種文件的語法不同。優先級:application.properties > application.yml > application.yaml,也就是如果相同的配置在三個文件中都存在的話,那就會優先采用 application.properties 中的配置。
-
application.properties
-
語法結構 :key=value
-
application.yml(或者application.yaml)
-
語法結構 :key:空格 value (注意,空格不能去掉,否則無法正確識別)
示例:
下面我們通過配置文件來修改 tomcat 的默認端口,首先在 resource 目錄下新建一個 application.properties 文件,然后在該文件下配置 tomcat 的端口號:

然后重新啟動啟動類即可。由此我們就只能通過 8888 端口來訪問接口了。
可以通過參考官網來知道如何通過哪些語法來修改所需配置:https://docs.spring.io/spring-boot/docs/current/reference/html/application-properties.html#application-properties
5.1、讀取配置
5.1.1、使用 @Value() 讀取配置
我們可以通過 @Value("${屬性名}") 的方法來讀取配置文件中的配置,該注解會直接將配置文件的該屬性值注入到使用該注解的變量中。
(請注意,使用 @Value() 方法給靜態變量注入是無效的,如果要給靜態變量賦值,可以使用set()方法,參考:https://blog.csdn.net/mononoke111/article/details/81088472)
比如,配置如下:
# application.properties 文件的配置 name=wen person.age=12 address[0]=address0
使用 @Value() 讀取配置內容,如下:
@RestController public class HelloController {
@Value("${name}") private String name; @Value("${person.age}") private int age; @Value("${address[0]}") private String address0; @RequestMapping("/hello") public String hello() { System.out.println(name); System.out.println(age); System.out.println(address0); } }
訪問 /hello 接口,輸出結果如下:

5.1.2、使用Environment讀取配置
使用 @Value 讀取配置時,需要一個個地寫配置屬性,在需要讀取少量配置時比較方便,當需要讀取大量配置時,此時我們可以通過 Evnironment 來讀取,就不用一個個地去讀取配置了。
如下:
import org.springframework.core.env.Environment; @RestController public class HelloController { @Autowired private Environment env; @RequestMapping("/hello") public String hello() { System.out.println(env.getProperty("name")); System.out.println(env.getProperty("person.age")); System.out.println(env.getProperty("address[0]")); return "hello Spring Boot 222!"; } }
訪問 /hello 接口,輸出結果如下:

這種方式是依賴注入Evnironment來完成,在成員變量 env 上加上 @Autowired 注解即可完成依賴注入,然后通過使用 env.getProperty("鍵名") 即可讀取出對應的配置的值。
5.1.3、使用@ConfigurationProperties讀取配置
使用 @ConfigurationProperties 可以將配置文件中的配置和類中的屬性進行綁定,給類中的屬性賦值。
比如,配置如下:
# application.properties 配置文件 name=wen address[0]=address0 person.age=12 person.name=personName person.address[0]=beijing person.address[1]=shanghai
定義類,通過 @ConfigurationProperties 注解將配置文件中的值和類中的屬性綁定,如下:
//注意別漏了下面的@Component注解 @Component //下面加上prefix參數指定使用配置文件中的哪個對象給person類綁定值,當不指定perfix參數時,默認是使用頂部對象,即整個配置文件中的配置作為一個對象 @ConfigurationProperties(prefix = "person") public class Person { private String name; private int age; private String[] address; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String[] getAddress() { return address; } public void setAddress(String[] address) { this.address = address; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + ", address=" + Arrays.toString(address) + '}'; } }
然后通過 @Autowired 直接使用該類實例,即可獲取到配置文件的屬性了。如下:
@RestController public class HelloController { @Autowired private Person person; @RequestMapping("/hello") public String hello() { System.out.println(person); return "hello Spring Boot 222!"; } }
訪問 /hello 接口,輸出結果如下:

6、profile(指定使用的配置)
profile 可以讓 Spring 對不同的環境提供不同配置的功能,可以通過激活、指定參數等方式快速切換環境。 也就是說,不同環境下我們可能有多個不同的配置,profile 可以讓我們簡單地去切換配置,而不是在部署不同環境時還有手動修改配置這么麻煩。
在實際開發環境中,我們存在開發環境的配置、測試環境的配置、生產環境的配置等等,當里面的配置信息很多時,例如:端口、上下文路徑、數據庫配置等等,若每次切換環境時,我們都需要進行修改這些配置信息時,會比較麻煩,profile的出現就是為了解決這個問題。
6.1、profile 的配置方式
6.1.1、多個配置文件方式
多個 profile 配置文件時,Spring 官方給出的多個配置文件的命名規則是application-{profile}.properties(.yaml/.yml),也就是 properties 和 yml(yaml)的方式是一樣的,只不過最終的語法不太一樣而已。
以 properties 作為示例如下:建立三個不同的 properties 文件分別模擬開發、測試、生產不同環境的配置,application-dev.properties、pplication-test.properties、pplication-pro.properties,如下:

內容分別如下:
#application-dev-properties文件內容如下: server.port=8081 #application-test-properties文件內容如下: server.port=8081 #application-pro-properties文件內容如下: server.port=8081
然后我們在 application.properties 中配置實際使用哪個配置文件,比如需要使用 pro 配置文件,如下:
#application.properties文件內容如下,只需通過spring.profiles.active指定使用哪個配置文件的配置即可 spring.profiles.active=pro
配置完后,啟動 springboot 項目,可以看到項目端口被配置為 8083,如下:

多個配置文件時,yml(yaml)和 properties 的方式是一樣的,只不過語法不太一樣而已,yml(yaml)文件中的語法如下:
spring:
profiles:
active: dev
6.1.2、yml多文檔方式
使用多個配置文件時,可以建立多個配置文件,然后再通過某個屬性配置來指定使用哪個配置文件中的配置。當使用 yml(yaml)作為配置文件時,可以使用單個 yml 多文檔的方式來使用 profile。
示例如下,先建立一個 application.yml 文件:

該文件內容如下:
--- server: port: 8081 spring: profiles: dev --- server: port: 8082 spring: profiles: test --- server: port: 8083 spring: profiles: pro --- spring: profiles: active: pro
在 yml 文件中,可以 --- 來劃分不同文檔區域,每個 --- 下面的配置作為一個單獨的文檔區域。上面我們在三個不同區域配置了三個不同屬性,并且指定了各個區域的 profiles 屬性,最后就可以通過 spring.profiles.active 屬性來指定使用哪個區域的配置。
配置完后,啟動 springboot 項目,可以看到項目端口被配置為 8083,如下:

6.2、profile 的激活方式
有多種方式可以激活 profile,比如上面示例中的在配置文件中指定的方式,另外還有命令行參數、虛擬機參數的方式,其中優先級:命令行參數 > 虛擬機參數 > 配置文件。
6.2.1、配置文件激活profile的方式
在配置文件通過指定 spring.profiles.active 即可激活 profile,比如使用 properties 文件,示例如下:
spring.profiles.active=pro
6.2.2、命令行參數激活profile的方式
通過命令行參數也可以激活 profile。
當通過 jar 包運行 springboot 程序時,可以通過直接在命令后面加參數來指定命令行參數,如下:
java –jar xxxxxx.jar --spring.profiles.active=pro
當使用 idea 集成環境時,可以直接在工具中配置命令行參數,如下:

6.2.3、虛擬機參數激活profile的方式
也可以通過指定虛擬機參數的方式來激活 profile。比如使用 idea 時,配置如下:

通過配置 -Dspring.profiles.active=dev 來指定使用哪個配置。
7、配置文件加載順序
7.1、內部配置加載順序
Springboot 程序啟動時,會從以下位置查找配置文件并加載:
- 當前項目根目錄下的/config目錄下
- f當前項目的根目錄下
- classpath:/config/:classpath的/config目錄(即resource目錄下的config目錄)
- classpath:/ :classpath的根目錄(即resource目錄下)
配置文件加載優先級為由上至下,上面的優先級更高,所有位置的文件都會被加載,高優先級配置內容會覆蓋低優先級配置內容。
假設項目如下,一個項目內有多個模塊,則配置文件優先級分別如下:

上面四個配置文件都會被加載,但是如果配置相同,則優先級高的配置文件的配置會被選中使用。
7.2、外部配置文件加載順序
外部配置文件,即不放在項目內的配置文件。在啟動項目時,可以通過命令行參數的方式來指定外部的配置文件作為優先級更高的配置文件。如下:
java –jar xxxxxx.jar --spring.config.additional-location="D:/xxx/application.properties"
此時指定的配置文件和默認加載的內部配置文件共同起作用形成互補配置,指定的配置文件的優先級更高。
或者我們可以在打出的 jar 包的相同目錄下新建一個 config 目錄,在該目錄下新建 application.properties 文件,則使用 java -jar 命令運行 springboot 項目時,無需指定配置文件,也會自動加載該目錄下的配置文件。
如下:

在打出的 jar 包的同級目錄下新建 config 目錄,在該目錄下建立配置文件,此時啟動 jar 包無需指定配置文件也會自動加載 config 目錄下的配置文件作為優先級更高的配置。
java –jar xxxxxx.jar --spring.config.additional-location="D:/xxx/application.properties"
8、springboot項目放置靜態資源
一個新建的 springboot 項目的目錄結構如下:

SpringBoot對于靜態資源放置的位置是有規定的,springboot 默認提供兩個目錄給我們存放靜態資源:
- 一個是 src/mian/resource目錄(上面將的就是這種情況)
- 一個是 ServletContext 根目錄下,也就是 src/main/webapp
8.1、在resources存放靜態資源
在 src/main/resources 目錄下,SpringBoot 提供了幾個默認的存放路徑來給我們存放靜態資源:
"classpath:/META-INF/resources/" "classpath:/resources/" "classpath:/static/" "classpath:/public/"
通俗來講classpath對應的項目中 src/main/resources 目錄。所以上面的路徑,比如如:“classpath: static/” 指的就是 src/main/resources/static 目錄。
所以說,我們可以在 springboot 項目的 src/main/resources/META-INF/resources、src/main/resources/public、src/main/resources/resources、src/main/resources/static 目錄下存放靜態資源。
如下,除了 5.jpg ,其他資源都可以通過 http://ip/項目上下文/靜態資源名 來直接訪問靜態資源

8.2、在 src/main/webapp 下存放靜態資源
一般創建的 maven 項目里面都沒有 webapp 文件夾,我們可以自己在 src/main 目錄下創建一個 webapp 目錄,然后在該目錄下存放各種靜態資源,就可以直接訪問靜態資源了。
8.3、自定義靜態資源路徑
我們也可以自己通過配置文件來指定靜態資源的存放路徑,在application.properties中配置。示例如下:
spring.resources.static-locations=classpath:/mystatic/,classpath:/myresources/
一旦自己定義了靜態文件夾的路徑,原來的自動配置就都會失效了。
9、JSR303(數據校驗)
JSR是Java Specification Requests的縮寫,意思是Java 規范提案。JSR已成為Java界的一個重要標準。
Bean Validation 中內置的 constraint:

Hibernate Validator 附加的 constraint:

使用可參考:https://blog.csdn.net/Young_Naive/article/details/113174827
9.1、使用數據校驗
Springboot中可以用@validated來校驗數據,如果數據異常則會統一拋出異常,方便異常中心統一處理。
我們這里來寫個注解讓我們的name只能支持Email格式
@Component //注冊bean
@ConfigurationProperties(prefix = "person")
@Validated //數據校驗
public class Person {
@Email(message="郵箱格式錯誤") //name必須是郵箱格式,否則將會
private String name;
}

浙公網安備 33010602011771號