春の@オーダー

1概要

このチュートリアルでは、Springのhttps://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/core/annotation/Order.html[ @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 の用途はさまざまな使用例にあります。その一例が、Springのリクエストフィルタです。

インジェクションの優先順位への影響により、シングルトンの起動順序にも影響を与える可能性があります。しかし、対照的に、依存関係と __ @ DependsOn __宣言は、シングルトンの起動順序を決定します。

このチュートリアルで言及されている例はすべてhttps://github.com/eugenp/tutorials/tree/master/spring-all[Githubでの使用]にあります。