1. 概要

このチュートリアルでは、Springの@Orderアノテーションについて学習します。 @Orderアノテーションは、アノテーションが付けられたコンポーネントまたはBeanの並べ替え順序を定義します。

コンポーネントの順序を決定するオプションのvalue引数があります。 デフォルト値はOrdered.LOWEST_PRECEDENCEです。 これは、コンポーネントが他のすべての順序付けされたコンポーネントの中で最も低い優先度を持っていることを示します。

同様に、値 Ordered.HIGHEST_PRECEDENCE を使用して、コンポーネント間の最高の優先度をオーバーライドできます。

2. @Orderを使用する場合

Spring 4.0以前は、@OrderアノテーションはAspectJの実行順序にのみ使用されていました。 これは、最上位のアドバイスが最初に実行されることを意味します。

Spring 4.0以降、コレクションへの挿入されたコンポーネントの順序付けをサポートしています。 その結果、Springは、注文値に基づいて同じタイプの自動配線されたBeanを注入します。

簡単な例でそれを調べてみましょう。

3. 使用方法@Order

まず、関連するインターフェイスとクラスを使用してプロジェクトを設定しましょう。

3.1. インターフェイスの作成

製品の評価を決定するRatingインターフェースを作成しましょう。

public interface Rating {
    int getRating();
}

3.2. コンポーネントの作成

最後に、いくつかの製品の評価を定義する3つのコンポーネントを作成しましょう。

@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;
    }
}

Average classは、値がオーバーライドされるため、優先度が最も低いことに注意してください。

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 のアプリケーションは、自動配線されたコンポーネントの順序が重要となるさまざまなユースケースで見つけることができます。 1つの例は、Springのリクエストフィルターです。

インジェクションの優先順位に影響するため、シングルトンの起動順序にも影響するように見える場合があります。 ただし、対照的に、依存関係と @DependsOn 宣言は、シングルトンの起動順序を決定します。

このチュートリアルで言及されているすべての例は、Githubにあります。