@Order in Spring

@ Commande au printemps

1. Vue d'ensemble

Dans ce didacticiel, nous allons découvrir l'annotation@Order de Spring. The @Order annotation defines the sorting order of an annotated component or bean.

Il a un argument de valeur facultatif qui détermine l'ordre du composant; la valeur par défaut estOrdered.LOWEST_PRECEDENCE. Cela indique que le composant a la priorité la plus basse parmi tous les autres composants ordonnés.

De même, la valeurOrdered.HIGHEST_PRECEDENCE peut être utilisée pour remplacer la priorité la plus élevée parmi les composants.

2. Quand utiliser@Order

Avant Spring 4.0, l'annotation@Order était utilisée uniquement pour l'ordre d'exécution AspectJ. Cela signifie que le conseil le plus élevé sera exécuté en premier.

Depuis Spring 4.0, il prend en charge la commande des composants injectés dans une collection. En conséquence, Spring injectera les haricots auto-câblés du même type en fonction de leur valeur de commande.

Explorons-le avec un exemple rapide.

3. Comment utiliser@Order

Tout d'abord, configurons notre projet avec l'interface et les classes appropriées.

3.1. Création d'interface

Créons l’interfaceRating qui détermine la note d’un produit:

public interface Rating {
    int getRating();
}

3.2. Création de composants

Enfin, créons trois composants qui définissent les notes de certains produits:

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

Notez que la classeAverage a la priorité la plus basse en raison de sa valeur remplacée.

4. Tester notre exemple

Jusqu'à présent, nous avons créé tous les composants requis et l'interface pour tester l'annotation@Order. Maintenant, testons-le pour confirmer qu'il fonctionne comme prévu:

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. Conclusion

Nous avons découvert l'annotation@Order dans cet article rapide. Nous pouvons trouver l'application de@Order dans divers cas d'utilisation - où l'ordre des composants auto-câblés est important. Les filtres de demande de Spring en sont un exemple.

En raison de son influence sur la priorité des injections, il peut sembler que cela puisse également influer sur l'ordre de démarrage du singleton. Mais en revanche, les relations de dépendance et les déclarations@DependsOn  déterminent l'ordre de démarrage des singleton.

Tous les exemples mentionnés dans ce didacticiel peuvent être trouvésover on Github.