iT邦幫忙

2025 iThome 鐵人賽

DAY 14
0
Software Development

spring boot 3 學習筆記系列 第 14

Day14 - Spring Boot 一切的起點 - 深入了解 @SpringBootApplication

  • 分享至 

  • xImage
  •  

前言:揭開專案啟動的神秘面紗

Day12Day13 內容中,我們學會了兩種將物件交給 Spring 管理 (註冊為 Bean) 的核心方法:

  1. 自動化元件掃描:使用 @Component, @Service 等註解 (Annotation),讓 Spring 像雷達一樣自動掃描並註冊我們自己撰寫的類別 (樂高城堡裡的「專業人士」)。
  2. 手動 Java 配置:使用 @Configuration 搭配 @Bean,像寫食譜一樣,手動教 Spring 如何建立並管理那些我們無法修改原始碼的外部類別 (例如咖啡機)。

現在,我們已經具備了這兩種強大的武器。是時候回到一切的起點,來揭開每個 Spring Boot 專案入口那行 main 方法上方的 @SpringBootApplication 註解 (Annotation),看看它背後到底隱藏了什麼秘密。

@SpringBootApplication:三位一體的啟動器

在每個 Spring Boot 專案中,你都會看到一個像這樣的程式進入點:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

// 就是這個神奇的註解!
@SpringBootApplication
public class DemoApplication {

	public static void main(String[] args) {
		SpringApplication.run(DemoApplication.class, args);
	}

}

初看之下,它只是一個簡單的註解 (Annotation)。但實際上,@SpringBootApplication 是一個「組合註解 (Composite Annotation)」,它悄悄地幫我們開啟了三個 Spring Boot 最核心的功能。

讓我們把它拆開來,一探究竟!

@SpringBootApplication = @SpringBootConfiguration + @EnableAutoConfiguration + @ComponentScan

https://ithelp.ithome.com.tw/upload/images/20250829/201718299BFiWUzC2T.png

1. @SpringBootConfiguration:宣告自己就是一本「食譜書」

https://ithelp.ithome.com.tw/upload/images/20250829/20171829jhwxPZDdPp.png

這個註解 (Annotation) 的底層其實是 @Configuration

  • 功能:它標明了當前這個類別本身就是一個 Spring 設定檔
  • 呼應昨天章節:還記得我們的「食譜書」嗎?@SpringBootConfiguration 等於告訴 Spring:「我這本主食譜書,裡面也可以定義 @Bean 方法來手動建立 Bean 喔!」

這代表,你完全可以在你的主程式類別中,直接定義 @Bean 方法,Spring 也會正確地讀取並管理它。

@SpringBootApplication
public class DemoApplication {

    // ... main method ...

    @Bean // 因為主類別也是一個 @Configuration,所以可以直接定義 Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

2. @ComponentScan:啟動「專業人士」的自動掃描雷達

這個註解 (Annotation) 我們在前天章節已經認識了。

  • 功能:它會啟動 Spring 的元件掃描機制。
  • 呼應單元一:它會自動掃描主應用程式類別 (DemoApplication) 所在的套件及其所有子套件,去尋找所有被 @Component@Service@Repository@Controller 等註解 (Annotation) 標記的類別,並將它們自動註冊為 Bean。

這就是為什麼我們能把 ControllerService 放在主程式的子套件下,而不需要做任何額外設定,Spring 就能自動找到它們的原因。

3. @EnableAutoConfiguration:Spring Boot 的智慧「魔法」

這是 Spring Boot 最具革命性的功能。

  • 功能:它會根據你專案中引入的依賴 (Dependencies)智慧地自動地幫你設定好許多預設的 Bean。
  • 比喻:想像一下,你在專案的 pom.xml 中加入了 spring-boot-starter-web 這個「網站開發懶人包」。@EnableAutoConfiguration 看到後,就會心領神會地說:「哦!你想做網站是吧?那我自動幫你把內嵌的 Tomcat 伺服器、DispatcherServlet 等網站開發需要的核心元件都設定好吧!」
  • 如果它偵測到你的專案有 spring-boot-starter-data-jpa 和 H2 資料庫的依賴,它就會自動幫你設定好資料庫連線池 (DataSource)。

這個機制讓我們省去了大量繁瑣的樣板設定,真正實現了「約定優於配置 (Convention over Configuration)」。

總覽:Spring Boot 的啟動流程

SpringApplication.run() 執行時,@SpringBootApplication 就像一位總指揮,同時發動了三項任務:

  1. @SpringBootConfiguration 生效:將主程式類別本身視為設定檔,檢查內部是否有 @Bean 方法需要處理。
  2. @ComponentScan 啟動:掃描專案套件,找到我們寫的各種 @Service@Controller 並註冊成 Bean。
  3. @EnableAutoConfiguration 啟動:檢查專案依賴,將 Spring Boot 提供的各種預設元件(如伺服器、資料庫連線)註冊成 Bean。

這三項任務完成後,所有需要的 Bean 都被放入了 IoC 容器中,你的應用程式就準備好運行了!

自訂你的啟動選項

現在你已經理解了 @SpringBootApplication 的組成,就能夠輕鬆看懂它的自訂選項了。

有時候,我們需要微調預設的行為,例如:

  • 元件被放在了非標準的套件路徑下。
  • 想停用某個不想要的自動配置。
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;

@SpringBootApplication(
    // 手動指定元件掃描的基礎套件路徑
    scanBasePackages = {"com.example.awesomeapp", "com.example.sharedcomponents"},

    // 排除掉指定的自動配置類別 (例如:我不想讓 Spring 自動設定資料庫)
    exclude = {DataSourceAutoConfiguration.class}
)
public class DemoApplication {
    // ...
}
  • scanBasePackages:告訴 @ComponentScan 不要只掃描預設路徑,也去我指定的其他套件路徑下看看。
  • exclude:告訴 @EnableAutoConfiguration:「嘿!我知道你想幫我自動設定資料庫,但這次不用了,謝謝你,我自己來。」

相關資料來源


上一篇
Day13 - Spring Boot 另一種 Bean - 手動 Java 配置
下一篇
Day15 - Spring Boot 依賴注入指南:@Autowired 的三種注入方法比較
系列文
spring boot 3 學習筆記16
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言