@Order in Spring

@Order in Spring

1. Visão geral

Neste tutorial, aprenderemos sobre a anotação@Order do Spring. The @Order annotation defines the sorting order of an annotated component or bean.

Ele tem um argumento de valor opcional que determina a ordem do componente; o valor padrão éOrdered.LOWEST_PRECEDENCE. Isso marca que o componente tem a menor prioridade entre todos os outros componentes solicitados.

Da mesma forma, o valorOrdered.HIGHEST_PRECEDENCE pode ser usado para substituir a prioridade mais alta entre os componentes.

2. Quando usar@Order

Antes do Spring 4.0, a anotação@Order era usada apenas para a ordem de execução AspectJ. Isso significa que o conselho de ordem mais alta será executado primeiro.

Desde o Spring 4.0, ele suporta o pedido de componentes injetados em uma coleção. Como resultado, o Spring injetará os beans com fio automático do mesmo tipo com base no valor do pedido.

Vamos explorá-lo com um exemplo rápido.

3. Como usar@Order

Em primeiro lugar, vamos configurar nosso projeto com a interface e classes relevantes.

3.1. Criação de Interface

Vamos criar a interfaceRating que determina a avaliação de um produto:

public interface Rating {
    int getRating();
}

3.2. Criação de Componentes

Finalmente, vamos criar três componentes que definem as classificações de alguns produtos:

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

Observe que o sclassAverage tem a prioridade mais baixa por causa de seu valor substituído.

4. Testando Nosso Exemplo

Até agora, criamos todos os componentes necessários e a interface para testar a anotação@Order. Agora, vamos testá-lo para confirmar se funciona conforme o esperado:

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. Conclusão

Aprendemos sobre a anotação@Order neste artigo rápido. Podemos encontrar a aplicação de@Order em vários casos de uso - onde a ordem dos componentes com fiação automática é importante. Um exemplo são os filtros de solicitação do Spring.

Devido à sua influência na precedência da injeção, pode parecer que também possa influenciar a ordem de inicialização do singleton. Mas, em contraste, as relações de dependência e@DependsOn declarations determinam a ordem de inicialização do singleton.

Todos os exemplos mencionados neste tutorial podem ser encontradosover on Github.