1. 概述
在本教程中,我們將學習 Spring 框架中的 @Order 註解。 @Order 註解定義了標註的組件或 Bean 的排序順序。
它具有可選的參數值,用於確定組件的排序順序;默認值為 Ordered.LOWEST_PRECEDENCE,這表示該組件在所有其他排序的組件中具有最低優先級。
類似地,可以使用值 Ordered.HIGHEST_PRECEDENCE 來覆蓋組件中的最高優先級。
2. 使用 @Order 的時機
在 Spring 4.0 之前,@Order 註解僅用於 AspectJ 執行順序。這意味着具有最高順序的 advice 將首先運行。
自 Spring 4.0 以來,它支持對注入的組件進行排序,並將其添加到集合中。因此,Spring 將根據組件的排序值注入相同類型的自動裝配 Bean。
讓我們通過一個簡單的示例來了解它。
3. 如何使用訂單
首先,讓我們使用相關的接口和類設置我們的項目。
3.1. 接口創建
讓我們創建用於確定產品評分的 評分 接口:
public interface Rating {
int getRating();
}3.2. 組件創建
最後,我們創建三個組件,用於定義一些產品的評分:
@Component
@Order(1)
public class Excellent implements Rating {
@Override
public int getRating() {
return 1;
}
}
@Component
@Order(2)
public class Good implements Rating {
@Override
public int getRating() {
return 2;
}
}
@Component
@Order(Ordered.LOWEST_PRECEDENCE)
public class Average implements Rating {
@Override
public int getRating() {
return 3;
}
}請注意,平均值優先級最低,因為它的值已被覆蓋。
4. 測試我們的示例
到目前為止,我們已經創建了所有必需的組件和用於測試 @Order 註解的接口。現在,讓我們測試它以確認它按預期工作:
public class RatingRetrieverUnitTest {
@Autowired
private List<Rating> ratings;
@Test
public void givenOrder_whenInjected_thenByOrderValue() {
assertThat(ratings.get(0).getRating(), is(equalTo(1)));
assertThat(ratings.get(1).getRating(), is(equalTo(2)));
assertThat(ratings.get(2).getRating(), is(equalTo(3)));
}
}5. 結論
我們通過這篇快速指南學習了 @Order 註解。我們可以找到 @Order 註解在各種用例中的應用,這些用例中,自動注入組件的順序至關重要。一個例子是 Spring 的請求過濾器。
由於它對注入優先級的影響,它可能看起來也會影響 Spring 的單例啓動順序。但是,與此不同,依賴關係和 @DependsOn 聲明決定了單例的啓動順序。