一、Spring Boot 是什么?
簡單說,Spring Boot 是簡化 Spring 應用開發的框架 —— 它整合了整個 Spring 技術棧,提供了 “一站式” J2EE 開發解決方案。
核心優點:
- 快速創建獨立運行的 Spring 項目,無需繁瑣配置;
- 內置 Tomcat、Jetty 等 Servlet 容器,應用無需打 war 包,直接用?
java -jar
?運行; - 提供 “啟動器(Starter)” 自動管理依賴,避免版本沖突;
- 大量自動裝配,開箱即用,還能靈活修改默認值;
- 無需 XML 配置,純注解開發;
- 自帶準生產環境監控(如健康檢查、指標收集)。
二、Spring Boot 項目創建方式
1. 手動創建(Maven 項目改造)
適合想深入理解依賴關系的場景,步驟如下:
- 新建 Maven 項目(打包方式選 jar);
- 在?
pom.xml
?中添加父工程(統一版本管理):<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.0</version> <!-- 版本可按需選擇 --> </parent>
- 導入所需場景的啟動器(如 web 開發):
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency> </dependencies>
- 編寫主程序類(啟動入口):
@SpringBootApplication public class MyApplication {public static void main(String[] args) {SpringApplication.run(MyApplication.class, args);} }
- 編寫 Controller 等業務代碼,運行 main 方法即可啟動。
2. 快速創建(Spring Initializer)
適合快速開發,IDE(如 IDEA、Eclipse)都支持:
- 新建項目時選擇 “Spring Initializr”;
- 填寫項目信息(Group、Artifact 等);
- 勾選所需依賴(如 Web、MySQL、MyBatis 等);
- 生成項目后,主程序類、目錄結構已自動創建,直接編寫業務代碼即可。
三、為什么說 “約定大于配置”?
這是 Spring Boot 最核心的思想,簡單理解:提前約定好一套規范,開發者無需手動配置,按約定開發即可。
在傳統開發中,很多工作需要通過配置文件(如 XML、JSON、注解等)明確指定細節(比如類的位置、方法的映射規則、資源的路徑等)。但這些配置往往是 “重復性” 的 —— 大多數項目的需求是相似的,比如 “控制器類通常放在controller
目錄”“數據庫表名通常和實體類名對應”。
“約定大于配置” 的本質是:框架或工具預先定義這些 “常見規則” 作為 “約定”,開發者只需遵循約定,就能省略這些重復配置;只有當需求特殊(比如想把控制器放在api
目錄而非controller
),才需要手動配置來 “覆蓋約定”。
比如:
Spring Boot 的目錄約定
早期的 Spring 框架需要大量 XML 配置來指定 “哪個類是控制器”“哪個方法映射哪個 URL”“服務類如何注入”。而 Spring Boot 采用 “約定大于配置” 后,通過目錄結構約定簡化了這些工作:
- 約定:
src/main/java/com/xxx/controller
?目錄下的類默認是控制器(無需額外注解聲明 “這是控制器”); - 約定:
src/main/java/com/xxx/service
?目錄下的類默認是服務層(框架會自動掃描并管理依賴注入); - 約定:配置文件默認放在?
src/main/resources/application.properties
(無需指定 “配置文件在哪”); - 約定:Web 應用默認端口是 8080(無需配置 “服務器端口”)。
好處:減少重復配置,提高開發效率,團隊協作更規范(大家都按同一套約定開發)。
四、Starter 啟動器:依賴管理的 “萬能鑰匙”
Starter(啟動器)?是 “約定大于配置” 理念的典型實踐,也是 Spring Boot 對 “場景化開發” 的解決方案:一個 Starter 對應一個開發場景,導入它就會自動包含該場景所需的所有依賴。
傳統的 Spring 項目開發中,開發者需要手動做兩件麻煩事:
- 依賴管理:為了實現某個功能(如 Web 開發),需要手動引入一系列相關依賴(如 Spring MVC、Tomcat、Jackson 等),且要保證依賴版本兼容,否則容易出現 “jar 包沖突”。
- 基礎配置:引入依賴后,還需要手動配置基礎組件(如 DispatcherServlet、數據源、事務管理器等),配置繁瑣且重復。
Starter 的出現就是為了解決這兩個問題:它通過 “預定義約定”,把某一場景所需的依賴、默認配置打包好,開發者只需引入一個 Starter,就能自動獲得該場景的所有必要支持。
比如:
spring-boot-starter-web
:包含 web 開發所需的 Spring MVC、Tomcat、JSON 解析等依賴;spring-boot-starter-jdbc
:包含 JDBC 開發所需的數據源、事務管理等依賴;spring-boot-starter-test
:包含單元測試所需的 JUnit、Mockito 等依賴。
使用方式:只需在?pom.xml
?中添加對應的 Starter 依賴,Spring Boot 會自動處理依賴傳遞和版本匹配,無需手動導入一堆 jar 包。
五、Spring Boot 整合單元測試
Spring Boot 簡化了單元測試流程,只需兩步:
導入測試 Starter:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope> </dependency>
編寫測試類:
用?@SpringBootTest
?標注測試類(自動加載 Spring 上下文),結合 JUnit 的?@Test
?即可:@SpringBootTest // 加載 Spring 容器 public class UserControllerTest {@Autowiredprivate UserController userController; // 注入要測試的組件@Testpublic void testHello() {String result = userController.hello();System.out.println(result); // 輸出測試結果} }
Spring Boot 整合單元測試和spring區別?
一、依賴管理與配置
對比項 | 傳統 Spring | Spring Boot |
---|---|---|
依賴引入 | 手動添加 JUnit、Mockito、Spring Test 等依賴,需處理版本兼容問題。 | 通過?spring-boot-starter-test ?一鍵引入所有測試依賴,自動管理版本。 |
配置文件 | 需要手動配置?applicationContext.xml ?或 Java 配置類,指定組件掃描路徑、數據源等。 | 自動加載默認配置,僅需?application.properties ?覆蓋少數自定義配置。 |
測試環境搭建 | 需使用?@ContextConfiguration ?注解指定配置文件或配置類。 | 使用?@SpringBootTest ?自動加載完整 Spring 上下文,或通過切片測試(如?@WebMvcTest )加載部分組件。 |
二、測試注解與框架支持
對比項 | 傳統 Spring | Spring Boot |
---|---|---|
核心測試注解 | @RunWith(SpringJUnit4ClassRunner.class) ?+?@ContextConfiguration | @SpringBootTest (替代前者) + 切片測試注解(如?@WebMvcTest 、@DataJpaTest ) |
模擬 HTTP 請求 | 使用?MockMvcBuilders.standaloneSetup() ?手動配置 MockMvc。 | 自動注入?MockMvc ,通過?@AutoConfigureMockMvc ?啟用。 |
數據庫測試 | 需手動配置嵌入式數據庫(如 H2)或使用內存數據庫。 | 自動配置嵌入式數據庫,支持?@DataJpaTest ?專用注解。 |
屬性配置測試 | 需使用?@TestPropertySource ?手動指定測試配置文件。 | 支持?@TestConfiguration ?或直接在測試類中覆蓋屬性。 |
三、測試效率與簡化程度
場景 | 傳統 Spring | Spring Boot |
---|---|---|
單元測試(Service) | java<br>@RunWith(SpringJUnit4ClassRunner.class)<br>@ContextConfiguration(classes = AppConfig.class)<br>public class UserServiceTest {<br> @Autowired<br> private UserService userService;<br> // 測試代碼<br>} | java<br>@SpringBootTest<br>public class UserServiceTest {<br> @Autowired<br> private UserService userService;<br> // 測試代碼<br>} |
Controller 測試 | 需手動配置 Controller、Service Mock 和視圖解析器。 | java<br>@WebMvcTest(UserController.class)<br>public class UserControllerTest {<br> @Autowired<br> private MockMvc mockMvc;<br> @MockBean<br> private UserService userService;<br> // 測試代碼<br>} |
數據庫集成測試 | 需配置數據源、事務管理器,手動回滾數據。 | java<br>@DataJpaTest<br>public class UserRepositoryTest {<br> @Autowired<br> private UserRepository userRepository;<br> // 測試代碼(自動回滾)<br>} |
六、Spring Boot 如何掃描組件?
Spring Boot 會自動掃描并加載容器中的組件(@Controller、@Service、@Component 等),掃描范圍由?主程序類(@SpringBootApplication 標注)所在包及所有子包?決定。
比如:
- 主程序類在?
com.example.demo
?包下; - 則?
com.example.demo.controller
、com.example.demo.service
?等子包中的組件會被自動掃描; - 若組件放在?
com.example.other
?包(主程序類所在包的外部),則需要手動添加?@ComponentScan("com.example.other")
?配置。
七、YAML 配置文件:比 properties 更優雅
Spring Boot 支持?application.yml
?作為配置文件,語法比?application.properties
?更簡潔,適合復雜配置。
基本語法:
- 用?
k: v
?表示鍵值對(冒號后必須有空格); - 用縮進表示層級關系(不允許用 tab,建議 2 個空格);
- 大小寫敏感。
示例:
# 配置服務器端口
server:port: 8081servlet:context-path: /demo # 項目訪問路徑# 配置自定義對象
person:name: 張三age: 20boss: falsebirth: 2003-01-01maps: {k1: v1, k2: v2} # Map 寫法lists: [籃球, 足球] # List 寫法dog: # 對象嵌套name: 旺財age: 3
如何讀取配置?
用?@ConfigurationProperties
?綁定配置到 Java 類:
@Component
@ConfigurationProperties(prefix = "person") // 綁定配置文件中 prefix 為 person 的屬性
public class Person {private String name;private Integer age;// 省略 get/set 方法
}
八、自動裝配原理:Spring Boot 如何 “自動” 工作?
自動裝配是 Spring Boot “開箱即用” 的核心,簡單說:Spring Boot 會根據導入的 Starter 和配置,自動創建并配置所需的組件(比如導入 web starter 會自動配置 DispatcherServlet)。
自動裝配的本質是Spring 框架在啟動時動態掃描并注冊 Bean,但 Spring Boot 在此基礎上增加了條件判斷和約定配置:
- 條件判斷:通過?
@Conditional
?系列注解,根據類路徑、配置屬性、Bean 存在性等條件決定是否注冊 Bean。 - 約定配置:框架預定義了一套默認配置(如數據源、Web 服務器),開發者只需引入依賴即可觸發相應配置。
核心依賴三個注解:
@SpringBootApplication:
主程序類的核心注解,是一個 “組合注解”,包含:@SpringBootConfiguration
:標記當前類為配置類(相當于?@Configuration
);@EnableAutoConfiguration
:開啟自動配置(核心);@ComponentScan
:指定組件掃描范圍(默認主程序類所在包)。
@EnableAutoConfiguration:
開啟自動配置的 “開關”,通過?@Import(EnableAutoConfigurationImportSelector.class)
?向容器中導入自動配置類(xxxAutoConfiguration)。原理:啟動時會掃描所有 jar 包中?
META-INF/spring.factories
?文件,加載其中?org.springframework.boot.autoconfigure.EnableAutoConfiguration
?對應的配置類(如?HttpEncodingAutoConfiguration
、DataSourceAutoConfiguration
?等),這些類會自動配置所需組件。@ConfigurationProperties:
將配置文件中的屬性(如?application.yml
?中的?person.name
)綁定到 Java 類的屬性上,實現配置與代碼的解耦。
九、Spring Boot 項目演變史
從傳統 Java 開發到 Spring Boot,經歷了多個階段:
- Servlet 時代:純手動編寫 Servlet、配置 web.xml,開發效率極低;
- SSH/SSM 時代:SSH(Struts + Spring + Hibernate)、SSM(Spring + SpringMVC + MyBatis)簡化了開發,但仍需大量 XML 配置;
- 單體應用:所有功能打包成一個 war 包,部署到 Tomcat,適合小型項目,但迭代和擴展困難;
- SOA(面向服務架構):將系統拆分為多個服務,通過服務總線通信,但服務耦合度仍較高;
- 微服務:2014 年 Martin Fowler 提出,將系統拆分為獨立部署的小型服務(每個服務專注一個功能),通過 HTTP 通信。Spring Boot 因簡化配置、內置容器等特點,成為微服務開發的首選框架。
十、架構對比:垂直架構、單體架構與微服務
架構類型 | 特點 | 優點 | 缺點 |
---|---|---|---|
垂直架構 | 按業務垂直劃分(如電商的訂單系統、用戶系統獨立部署) | 簡單直接,初期開發快 | 服務重復開發,數據冗余 |
單體架構 | 所有功能打包成一個應用(如一個 war 包包含所有模塊) | 部署簡單,調試方便 | 代碼臃腫,迭代慢,故障影響整體 |
微服務 | 拆分為獨立部署的小型服務(每個服務有自己的數據庫和接口) | 獨立迭代、擴展靈活,技術棧多樣 | 分布 |