1. 概述
在 Spring Boot 應用中,多個配置類經常共存,用於定義 Bean、屬性或集成。 雖然 Spring 會自動檢測和處理這些配置,但它並不能保證配置的處理順序。 在配置相互依賴,或者我們需要可預測的初始化(例如,在數據配置之前進行服務配置)的情況下,控制 配置順序變得至關重要。
在本教程中,我們將探索 Spring Boot 在應用程序啓動期間確定配置順序的方法,以及開發人員如何使用註解(如 @Order、@AutoConfigureOrder、@AutoConfigureAfter、和@AutoConfigureBefore)來控制它。 此外,我們還將解釋常規配置和自動配置排序之間的差異,幫助讀者瞭解何時以及如何使用每種機制。 為了鞏固這些概念,文章包含可運行的示例以及單元測試,這些測試演示了不同排序策略在實踐中的行為。
2. 理解配置類
Spring 配置類可以有兩種形式:完整配置和輕量級配置。一個 完整配置 類被註解為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 fullる configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 squa configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 full configuration 類,標註為 lite configuration 類,標註為 Лучший 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 Andorra 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full Fc 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 fullgetClassName 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full configuration 類,標註為 full
3. 配置類排序的默認行為
默認情況下,Spring Boot 不保證對配置類進行任何排序。它掃描所有候選類並按找到的方式加載它們,即在類路徑中找到的順序。
3.1. 示例:不指定明確順序
以下代碼定義了兩個獨立的配置類,ConfigA 和 ConfigB:
@Configuration
public class ConfigA {
@Bean
public String beanA() {
return "Bean A";
}
}@Configuration
public class ConfigB {
@Bean
public String beanB() {
return "Bean B";
}
}這裏,兩個配置都聲明瞭彼此不相關的Bean。當Spring加載這些配置時,無論哪個配置類先加載,兩個Bean都能成功註冊。
在運行測試之前,務必驗證這兩個Bean是否在上下文中存在,無論它們的加載順序如何。
@SpringBootTest
class DefaultConfigOrderUnitTest {
@Autowired
private ApplicationContext context;
@Test
void givenConfigsWithoutOrder_whenLoaded_thenBeansExistRegardlessOfOrder() {
assertThat(context.getBean("beanA")).isEqualTo("Bean A");
assertThat(context.getBean("beanB")).isEqualTo("Bean B");
}
}此測試確認 Spring 註冊了這兩個 Bean,即使沒有定義任何特定的順序。容器不強制或依賴任何顯式的排序。
3. 使用 <em @Order 註解控制加載順序
有時初始化順序很重要,例如當一個配置項依賴於另一個配置項的 Bean 時。 <em @Order 註解有助於強制執行可預測的加載順序。
這裏,<em ConfigOne 類必須在 <em ConfigTwo 類之前加載。 我們指定了明確的順序值:
@Configuration
@Order(1)
public class ConfigOne {
@Bean
public String configOneBean() {
return "ConfigOneBean";
}
}@Configuration
@Order(2)
public class ConfigTwo {
@Bean
public String configTwoBean() {
return "ConfigTwoBean";
}
}Spring 會在 ConfigOne 之前處理 ConfigTwo,因為它的優先級值較低。優先級不影響獨立 Bean 的創建,但當需要時,它確保了依賴項的創建順序。
以下單元測試驗證了兩個 Bean 都被創建,並且由於 ConfigOne 的優先級值較小,因此它會在 ConfigTwo 之前加載。但是,Bean 的創建順序在沒有依賴關係的情況下通常無法直接觀察到:
@SpringBootTest(classes = {ConfigTwo.class, ConfigOne.class})
class OrderedConfigUnitTest {
@Autowired
private ApplicationContext context;
@Test
void givenOrderedConfigs_whenLoaded_thenOrderIsRespected() {
String beanOne = context.getBean("configOneBean", String.class);
String beanTwo = context.getBean("configTwoBean", String.class);
assertThat(beanOne).isEqualTo("ConfigOneBean");
assertThat(beanTwo).isEqualTo("ConfigTwoBean");
}
}儘管在測試類中,ConfigTwo 類首先聲明,但 Spring 仍然會首先加載 ConfigOne,從而尊重順序註解的優先級。
4. 使用 <em @DependsOn> 管理依賴關係
有時,一個 Bean 會顯式地依賴另一個 Bean 的初始化。<em @DependsOn</em>> 註解在 Bean 級別而非配置級別強制執行這種關係。下面我們來看一個 Bean 如何依賴另一個 Bean:
@Configuration
public class DependsConfig {
@Bean
public String firstBean() {
return "FirstBean";
}
@Bean
@DependsOn("firstBean")
public String secondBean() {
return "SecondBeanAfterFirst";
}
}這裏,secondBean 依賴於 firstBean。Spring 確保 firstBean 在創建 secondBean 之前已完全初始化。
下面的單元測試確保兩個 Bean 已註冊,並且依賴 Bean 在依賴項可用後可用:
@SpringBootTest(classes = DependsConfig.class)
class DependsConfigUnitTest {
@Autowired
private ApplicationContext context;
@Test
void givenDependsOnBeans_whenLoaded_thenOrderIsMaintained() {
String first = context.getBean("firstBean", String.class);
String second = context.getBean("secondBean", String.class);
assertThat(first).isEqualTo("FirstBean");
assertThat(second).isEqualTo("SecondBeanAfterFirst");
}
}測試確保兩個 Bean 存在且初始化順序正確,按照 @DependsOn 註解定義。
5. Spring Boot 中的自動配置順序
Spring Boot 使用自動配置類來設置應用程序的默認配置。當存在多個自動配置時,Spring 將使用 @AutoConfigureOrder、@AutoConfigureAfter 和 @AutoConfigureBefore 來確定它們的順序。
讓我們進一步探索這些內容:
@Configuration
@AutoConfigureOrder(1)
public class FirstAutoConfig {
@Bean
public String autoBeanOne() {
return "AutoBeanOne";
}
}@Configuration
@AutoConfigureAfter(FirstAutoConfig.class)
public class SecondAutoConfig {
@Bean
public String autoBeanTwo() {
return "AutoBeanTwoAfterOne";
}
}SecondAutoConfig 確保它在 FirstAutoConfig 之後加載,使用 @AutoConfigureAfter 註解。這些註解允許 Spring Boot 內部管理配置順序。
下面的測試確認應用程序上下文中自動配置的 Bean 是否存在:
@SpringBootTest(classes = {SecondAutoConfig.class, FirstAutoConfig.class})
class AutoConfigOrderUnitTest {
@Autowired
private ApplicationContext context;
@Test
void givenAutoConfigs_whenLoaded_thenOrderFollowsAnnotations() {
String beanOne = context.getBean("autoBeanOne", String.class);
String beanTwo = context.getBean("autoBeanTwo", String.class);
assertThat(beanOne).isEqualTo("AutoBeanOne");
assertThat(beanTwo).isEqualTo("AutoBeanTwoAfterOne");
}
}儘管在測試中,SecondAutoConfig 排列在 FirstAutoConfig 之前,但標註的順序確保 Spring 仍然以正確的順序加載它們。
6. 結論
在本文中,我們討論了 Spring Boot 中配置順序作為構建可預測且易於維護應用程序的關鍵工具。 通過結合 @Order, @DependsOn, 和自動配置註解,開發人員可以精確控制啓動序列並避免初始化衝突。
這些技術確保我們的應用程序上下文始終保持一致加載,無論配置是用户自定義的還是自動配置的。
對於大多數應用程序,顯式配置排序是不必要的。 Spring 的依賴解析機制會根據依賴關係自動處理 Bean 創建順序。 僅當配置處理的順序確實影響應用程序的行為時,才謹慎使用配置排序。 如往常一樣,這些示例的代碼可在 GitHub 上找到:https://github.com/eugenp/tutorials/tree/master/spring-boot-modules/spring-boot-config-order。