春の@オーダー

春の@注文

1. 概要

このチュートリアルでは、Springの@Orderアノテーションについて学習します。 The @Order annotation defines the sorting order of an annotated component or 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 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のリクエストフィルターです。

注入の優先順位への影響により、シングルトンの起動順序にも影響するように思われるかもしれません。 ただし、対照的に、依存関係と@DependsOn declarationsは、シングルトンの起動順序を決定します。

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