知識庫 / Spring RSS 訂閱

Spring 中的訂單管理

Spring
HongKong
4
02:01 PM · Dec 06 ,2025

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 聲明決定了單例的啓動順序。

user avatar
0 位用戶收藏了這個故事!
收藏

發佈 評論

Some HTML is okay.