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