各位志同道合的朋友們大家好,我是一個一直在一線互聯網踩坑十余年的編碼愛好者,現在將我們的各種經驗以及架構實戰分享出來,如果大家喜歡,就關注我,一起將技術學深學透,我會每一篇分享結束都會預告下一專題
為什么要用 Spring Boot?
Spring Boot 來自于 Spring 大家族,是 Spring 官方團隊(Pivotal 團隊)提供的全新框架,它的誕生解決了 Spring 框架使用較為繁瑣的問題。Spring Boot 的核心思想是約定優于配置,讓開發人員不需要配置任何 XML 文件,就可以像 Maven 整合 Jar 包一樣,整合并使用所有框架。
Spring Boot 特性
- 秒級構建一個項目;
- 便捷的對外輸出格式,如 REST API、WebSocket、Web 等;
- 簡潔的安全集成策略;
- 內嵌容器運行,如 Tomcat、Jetty;
- 強大的開發包,支持熱啟動;
- 自動管理依賴;
- 自帶應用監控。
Spring Boot 2 對系統環境的要求
- JAVA 8+
- Gradle 4+ or Maven 3.2+
- Tomcat 8+
Spring Boot 使用
在開始之前,我們先來創建一個Spring Boot 項目。
Spring Boot 有兩種快速創建的方式:Spring 官網在線網站創建和 IntelliJ IDEA 的 Spring Initializr 創建,下面分別來看。
創建 Spring Boot 項目
1)在線網站創建
在瀏覽器輸入 https://start.spring.io,頁面打開如下圖所示:
?
填寫相應的項目信息,選擇對應的 Spring Boot 和 Java 版本點擊 “Generate the project”按鈕下載項目壓縮文件,解壓后用 IDEA 打開即可。
其中 Group 和 Artifact 是 Maven 項目用來確認依賴項目的標識,比如:
‹dependency›
‹groupId›org.springframework‹/groupId›
‹artifactId›spring-core‹/artifactId›
‹version›4.1.6.RELEASE‹/version›
‹/dependency›
Group 對應的是配置文件的 groupId,相當于項目的包名;而 Artifact 對應的是配置文件的 artifactId,相當于項目名。
2)使用 IntelliJ IDEA 創建
① 新建項目 → 選擇 Spring Initialzr,如下圖所示:
?
② 點擊 Next 按鈕,填寫對應的項目信息(和在線網站創建的字段基本相同),如下圖所示:
?
③ 點擊 Next 按鈕,選擇相應的依賴信息,如下圖所示:
?
④ 點擊 Next 按鈕,選擇項目保存的路徑,點擊 Finish 創建項目完成,如下圖所示:
?
創建一個 Web 應用
1)pom.xml 中添加 Web 模塊的依賴,如下所示:
‹dependency›
‹groupId›org.springframework.boot‹/groupId›
‹artifactId›spring-boot-starter-web‹/artifactId›
‹/dependency›
2)創建后臺代碼
import org.springframework.web.bind.annotation.RequestMApping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@RequestMapping("/index")
public String index(String name) {
return "Hello, " + name;
}
}
3)啟動并訪問項目
項目的啟動類是標識了 @Spring BootApplication 的類,代碼如下所示:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SpringbootlearningApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootlearningApplication.class, args);
}
}
啟動并訪問 http://localhost:8080/index?name=laowang 效果如下:
?
到目前為止 Spring Boot 的項目就創建并正常運行了。
設置配置文件
Spring Boot 的配置文件,是 resources 目錄下 application.properties 文件,如下圖所示:
?
可以在配置文件中設置很多關于 Spring 框架的配置,格式如下配置所示:
# 項目運行端口
server.port=8086
# 請求編碼格式
server.tomcat.uri-encoding=UTF-8
Spring Boot 的其他功能開發和 Spring 相同(Spring Boot 2 是基于 Spring Framework 5 構建的),本文就不過多的介紹了,感興趣的朋友可以點擊這里查看
Spring Boot 發布
Spring Boot 項目的發布方式有兩種:
- 內置容器運行
- 外置容器(Tomcat)運行
內置容器運行
1)打包應用
使用窗口命令,在 pom.xml 同級目錄下:
mvn clean package -Dmaven.test.skip=true
Dmaven.test.skip=true 表示不執行測試用例,也不編譯測試用例類。
2)啟動應用
后臺啟動 Java 程序, 命令如下:
nohup java -jar springbootlearning-0.0.1-SNAPSHOT.jar &
停止程序
首先查詢 Java 程序的 pid
ps -ef|grep java
再停止程序
kill -9 pid
操作如下圖所示:
?
擴展內容
指定程序運行日志文件
nohup java -jar springbootlearning-0.0.1-SNAPSHOT.jar 1››logs 2››errlog &
其中:
- 1:表示普通日志
- 2:表示錯誤日志
外置容器(Tomcat)運行
1)排除內置 Tomcat
‹dependency›
‹groupId›org.springframework.boot‹/groupId›
‹artifactId›spring-boot-starter-tomcat‹/artifactId›
‹scope›provided‹/scope›
‹/dependency›
將 scope 屬性設置為 provided,表示打包不會包含此依賴。
2)配置啟動類
在項目的啟動類中繼承 Spring BootServletInitializer 并重寫 configure() 方法:
@SpringBootApplication
public class PackageApplication extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(PackageApplication.class);
}
public static void main(String[] args) {
SpringApplication.run(PackageApplication.class, args);
}
}
3)打包應用
使用窗口命令,在 pom.xml 同級目錄下:
mvn clean package -Dmaven.test.skip=true
4)部署應用
打包完成會在 target 目錄下生成:項目名 + 版本號.war 文件,復制到 Tomcat 的 webapps 目錄下,運行 Tomcat 即可。
相關面試題
1.Spring Boot 2.0 支持最低的 JDK 版本是?
A:JDK 6B:JDK 7C:JDK 8D:JDK 9
答:C
2.Spring、Spring Boot、Spring Cloud 是什么關系?
答:它們都是來自于 Spring 大家庭,Spring Boot 是在 Spring 框架的基礎上開發而來,讓更加方便使用 Spring;Spring Cloud 是依賴于 Spring Boot 而構建的一套微服務治理框架。
3.Spring Boot 項目有哪些優勢?
答:Spring Boot 項目優勢如下:
- 開發變得簡單,提供了豐富的解決方案,快速集成各種解決方案提升開發效率;
- 配置變得簡單,提供了豐富的 Starters,集成主流開源產品往往只需要簡單的配置即可;
- 部署變得簡單,其本身內嵌啟動容器,僅僅需要一個命令即可啟動項目,結合 Jenkins、Docker 自動化運維非常容易實現;
- 監控變得簡單,自帶監控組件,使用 Actuator 輕松監控服務各項狀態。
4.如何將 Spring Boot 項目打包成 war 包?
答:在 pom.xml 里設置 ‹packaging›war‹/packaging› 。
5.在 Maven 項目中如何修改打包名稱?
答:在 pom.xml 文件的 build 節點中,添加 finalName 節點并設置為要的名稱即可,配置如下:
‹build›
‹finalName›warName‹/finalName›
‹/build›
6.Ant、Maven、Gradle 有什么區別?
答:Ant、Maven、Gradle 是 Java 領域中主要有三大構建工具,它們的區別如下:
- Ant(AnotherNeatTool)誕生于 2000 年,是由 Java 編寫,采用 XML 作為構建腳本,這樣就允許你在任何環境下運行構建。Ant 是 Java 領域最早的構建工具,不過因為操作復雜,慢慢的已經被淘汰了;
- Maven 誕生于 2004 年,目的是解決程序員使用 Ant 所帶來的一些問題,它的好處在于可以將項目過程規范化、自動化、高效化以及強大的可擴展性;
- Gradle 誕生于 2009 年,是一個基于 Apache Ant 和 Apache Maven 概念的項目自動化建構工具。它使用一種基于 Groovy 的特定領域語言來聲明項目設置,而不是傳統的 XML。結合了前兩者的優點,在此基礎之上做了很多改進,它具有 Ant 的強大和靈活,又有 Maven 的生命周期管理且易于使用。
Spring Boot 官方支持 Maven 和 Gradle 作為項目構建工具。Gradle 雖然有更好的理念,但是相比 Maven 來講其行業使用率偏低,并且 Spring Boot 官方默認使用 Maven。
7.Maven 如何設置發布的包名?
答:在 build 節點下設置 finalName 就是發布的包名,如下代碼所示:
‹build›
‹finalName›biapi‹/finalName›
‹/build›
8.Spring Boot 熱部署有幾種方式?
答:Spring Boot 熱部署主要有兩種方式:Spring Loaded、Spring-boot-devtools。
方式 1:Spring Loaded
在 pom.xml 文件中添加如下依賴:
‹plugin›
‹groupId›org.springframework.boot‹/groupId›
‹artifactId›spring-boot-maven-plugin‹/artifactId›
‹dependencies›
‹dependency›
‹groupId›org.springframework‹/groupId›
‹artifactId›springloaded‹/artifactId›
‹version›1.2.6.RELEASE‹/version›
‹/dependency›
‹/dependencies›
‹configuration›
‹mainClass›此處為入口類‹/mainClass›
‹/configuration›
‹/plugin›
方式 2:Spring-boot-devtools
在 pom.xml 文件中添加如下依賴:
‹dependency›
‹groupId›org.springframework.boot‹/groupId›
‹artifactId›spring-boot-devtools‹/artifactId›
‹scope›provided‹/scope›
‹optional›true‹/optional›
‹/dependency›
9.Spring Boot 2.0 可以在 Tomcat 7 運行嗎?為什么?
答:Spring Boot 2.0 無法在 Tomcat 7 上運行。因為 Spring Boot 2.0 使用的是 Spring Framework 5,Spring Framework 5 使用的是 Servlet 3.1,而 Tomcat 7 最高支持到 Servlet 3.0,所以 Spring Boot 2.0 無法在 Tomcat 7 上運行。
10.如何使用 Jetty 代替 Tomcat?
答:在 spring-boot-starter-web 移除現有的依賴項,添加 Jetty 依賴,配置如下:
‹dependency›
‹groupId›org.springframework.boot‹/groupId›
‹artifactId›spring-boot-starter-web‹/artifactId›
‹exclusions›
‹exclusion›
‹groupId›org.springframework.boot‹/groupId›
‹artifactId›spring-boot-starter-tomcat‹/artifactId›
‹/exclusion›
‹/exclusions›
‹/dependency›
‹dependency›
‹groupId›org.springframework.boot‹/groupId›
‹artifactId›spring-boot-starter-jetty‹/artifactId›
‹/dependency›
11.Spring Boot 不支持以下哪個內嵌容器?
A:TomcatB:JettyC:UndertowD:Nginx
答:D
題目解析:Jetty 容器支持如下:
‹dependency›
‹groupId›org.springframework.boot‹/groupId›
‹artifactId›spring-boot-starter-web‹/artifactId›
‹exclusions›
‹exclusion›
‹groupId›org.springframework.boot‹/groupId›
‹artifactId›spring-boot-starter-tomcat‹/artifactId›
‹/exclusion›
‹/exclusions›
‹/dependency›
‹dependency›
‹groupId›org.springframework.boot‹/groupId›
‹artifactId›spring-boot-starter-jetty‹/artifactId›
‹/dependency›
Undertow 容器支持如下:
‹dependency›
‹groupId›org.springframework.boot‹/groupId›
‹artifactId›spring-boot-starter-web‹/artifactId›
‹exclusions›
‹exclusion›
‹groupId›org.springframework.boot‹/groupId›
‹artifactId›spring-boot-starter-tomcat‹/artifactId›
‹/exclusion›
‹/exclusions›
‹/dependency›
‹dependency›
‹groupId›org.springframework.boot‹/groupId›
‹artifactId›spring-boot-starter-undertow‹/artifactId›
‹/dependency›
12.Spring Boot 中配置文件有幾種格式?
答:Spring Boot 中有 .properties 和 .yml 兩種配置文件格式,它們主要的區別是書寫格式不同。
.properties 配置文件格式如下:
app.user.name = hellojava
.yml 配置文件格式如下:
app:
user:
name: hellojava
13.項目中有兩個配置 application.properties 和 application.yml,以下說法正確的是?
A:application.properties 的內容會被忽略,只會識別 application.yml 的內容。B:兩個配置文件同時有效,有相同配置時,以 application.properties 文件為主。C:application.yml 的內容會被忽略,只會識別 application.properties 的內容。D:兩個配置文件同時有效,有相同配置時,以 application.yml 文件為主。
答:B
14.RequestMapping 和 GetMapping 有什么不同?
答:RequestMapping 和 GetMapping 區別如下:
- RequestMapping 可以支持 GET、POST、PUT 請求;
- GetMapping 是一個組合注解,相當于 @RequestMapping(method = RequestMethod.GET)。
15.以下關于 @RestController 和 @Controller 說法正確的?
A:@Controller 返回 JSON 數據B:@RestController 返回 JSON 數據C:@APIController 返回 JSON 數據D:以上都對
答:B
16.Spring Cache 常用的緩存注解有哪些?
答:Spring Cache 常用注解如下:
- @Cacheable:用來聲明方法是可緩存,將結果存儲到緩存中以便后續使用相同參數調用時不需執行實際的方法,直接從緩存中取值;
- @CachePut:使用它標注的方法在執行前,不會去檢查緩存中是否存在之前執行過的結果,而是每次都會執行該方法,并將執行結果以鍵值對的形式存入指定的緩存中;
- CacheEvict:是用來標注在需要清除緩存元素的方法或類上的,當標記在一個類上時表示其中所有方法的執行都會觸發緩存的清除操作。
17.Spring Boot Admin 和 Spring Boot Actuator 的關系是什么?
答:Spring Boot Admin 使用了 Spring Boot Actuator 接口進行 UI 美化封裝的監控工具,它以圖形化的方式查詢單個應用的詳細狀態,也可以使用 Spring Boot Admin 來監控整個集群的狀態。
18.如何理解 Spring Boot 中的 Stater?
答:Stater 可以理解為啟動器,它是方便開發者快速集成其他框架到 Spring 中的一種技術。比如,spring-boot-starter-data-jpa 就是把 JPA 快速集成到 Spring 中。
19.常見的 starter 有哪些?
答:常見的 starter 如下:
- spring-boot-starter-web:Web 開發支持
- spring-boot-starter-data-jpa:JPA 操作數據庫支持
- spring-boot-starter-data-redis:Redis 操作支持
- spring-boot-starter-data-solr:Solr 權限支持
- mybatis-spring-boot-starter:MyBatis 框架支持
20.Spring Boot Starter JDBC 和 Spring JDBC 有什么關系?
答:spring-boot-starter-jdbc 是 Spring Boot 針對 JDBC 的使用提供了對應的 Starter 包,在 Spring JDBC 上做了進一步的封裝,方便在 Spring Boot 生態中更好的使用 JDBC。
21.Spring Boot 有哪幾種讀取配置的方式?
答:Spring Boot 可以通過 @Value、@Environment、@ConfigurationProperties 這三種方式來讀取。
例如,配置文件內容如下:
app.name=中文
① Value 方式
@Value("${app.name}")
private String appName;
② Environment 方式
public class HelloController {
@Autowired
private Environment environment;
@RequestMapping("/index")
public String index(String hiName) {
// 讀取配置文件
String appName = environment.getProperty("app.name");
return "Hello, " + hiName + " |@" + appName;
}
}
③ ConfigurationProperties 方式
@ConfigurationProperties(prefix = "app")
public class HelloController {
// 讀取配置文件,必須有 setter 方法
private String name;
public void setName(String name) {
this.name = name;
}
@RequestMapping("/index")
public String index(String hiName) {
System.out.println("appname:" + name);
return "Hello, " + hiName + " |@" + appName;
}
}
22.使用 @Value 讀取中文亂碼是什么原因?如何處理?
答:這是因為配置文件的編碼格式導致的,需要把編碼格式設置為 UTF-8,如下圖所示:
?
設置完成之后,重新啟動 IDEA 就可以正常顯示中文了。
總結
通過本文我們學習了 Spring Boot 的兩種創建方式:在線網站創建和 IntelliJ IDEA 方式創建。知道了 Spring Boot 發布的兩種方式:內置容器和外置 Tomcat,知道了 Spring Boot 項目特性,以及配置文件 .properties 和 .yml 的差異,掌握了讀取配置文件的三種方式:@Value、@Environment、@ConfigurationProperties。
下一篇:MyBatis 核心知識
在公眾號[架構師修煉]菜單中可自行獲取專屬架構視頻資料,包括不限于 java架構、Python系列、人工智能系列、架構系列,以及最新面試、小程序、大前端均無私奉獻,你會感謝我的哈
?
往期精選(全集WX公號【架構師修煉】)
分布式數據之緩存技術,一起來揭開其神秘面紗
分布式數據復制技術,今天就教你真正分身術
數據分布方式之哈希與一致性哈希,我就是個神算子
分布式存儲系統三要素,掌握這些就離成功不遠了
想要設計一個好的分布式系統,必須搞定這個理論
分布式通信技術之發布訂閱,干貨滿滿
分布式通信技術之遠程調用:RPC
消息隊列Broker主從架構詳細設計方案,這一篇就搞定主從架構
消息中間件路由中心你會設計嗎,不會就來學學
消息隊列消息延遲解決方案,跟著做就行了
秒殺系統每秒上萬次下單請求,我們該怎么去設計
【分布式技術】分布式系統調度架構之單體調度,非掌握不可
CDN加速技術,作為開發的我們真的不需要懂嗎?
煩人的緩存穿透問題,今天教就你如何去解決
分布式緩存高可用方案,我們都是這么干的
每天百萬交易的支付系統,生產環境該怎么設置JVM堆內存大小
你的成神之路我已替你鋪好,沒鋪你來捶我