在 Day12 和 Day13 內容中,我們學會了兩種將物件交給 Spring 管理 (註冊為 Bean) 的核心方法:
@Component
, @Service
等註解 (Annotation),讓 Spring 像雷達一樣自動掃描並註冊我們自己撰寫的類別 (樂高城堡裡的「專業人士」)。@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
@SpringBootConfiguration
:宣告自己就是一本「食譜書」這個註解 (Annotation) 的底層其實是 @Configuration
。
@SpringBootConfiguration
等於告訴 Spring:「我這本主食譜書,裡面也可以定義 @Bean
方法來手動建立 Bean 喔!」這代表,你完全可以在你的主程式類別中,直接定義 @Bean
方法,Spring 也會正確地讀取並管理它。
@SpringBootApplication
public class DemoApplication {
// ... main method ...
@Bean // 因為主類別也是一個 @Configuration,所以可以直接定義 Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
@ComponentScan
:啟動「專業人士」的自動掃描雷達這個註解 (Annotation) 我們在前天章節已經認識了。
DemoApplication
) 所在的套件及其所有子套件,去尋找所有被 @Component
、@Service
、@Repository
、@Controller
等註解 (Annotation) 標記的類別,並將它們自動註冊為 Bean。這就是為什麼我們能把 Controller
、Service
放在主程式的子套件下,而不需要做任何額外設定,Spring 就能自動找到它們的原因。
@EnableAutoConfiguration
:Spring Boot 的智慧「魔法」這是 Spring Boot 最具革命性的功能。
pom.xml
中加入了 spring-boot-starter-web
這個「網站開發懶人包」。@EnableAutoConfiguration
看到後,就會心領神會地說:「哦!你想做網站是吧?那我自動幫你把內嵌的 Tomcat 伺服器、DispatcherServlet 等網站開發需要的核心元件都設定好吧!」spring-boot-starter-data-jpa
和 H2 資料庫的依賴,它就會自動幫你設定好資料庫連線池 (DataSource
)。這個機制讓我們省去了大量繁瑣的樣板設定,真正實現了「約定優於配置 (Convention over Configuration)」。
當 SpringApplication.run()
執行時,@SpringBootApplication
就像一位總指揮,同時發動了三項任務:
@SpringBootConfiguration
生效:將主程式類別本身視為設定檔,檢查內部是否有 @Bean
方法需要處理。@ComponentScan
啟動:掃描專案套件,找到我們寫的各種 @Service
、@Controller
並註冊成 Bean。@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
:「嘿!我知道你想幫我自動設定資料庫,但這次不用了,謝謝你,我自己來。」