介绍:
Spring @Order注释是在Spring 2.0中首次引入的。 然后,它仅用于定义AspectJ建议中的顺序。 在Spring 4.0的后面,对该注释的实现进行了进一步改进。 从那时起,它还支持对Java数组或List之类的集合中的Spring组件或bean进行排序。
对于基于Spring XML的应用程序,此注释在内部使用OrderComparator类,对于基于注释的Spring应用程序,此注释在内部使用AnnotationAwareOrderComparator 。
在本教程中,我们将探讨如何使用此注释。
Spring
Spring @Order批注仅接受一个可选参数value ,该参数确定组件的顺序:
@Retention(value=RUNTIME)
@Target(value={TYPE,METHOD,FIELD})
@Documented
public @interface Order
此参数的值越低,其优先级越高。 换句话说,值较低的将在Java List或数组中排在第一位。
此参数的默认值为Ordered。 LOWEST_PRECEDENCE 。 这意味着标记的组件在所有有序bean中的优先级最低。 类似地,我们可以使用Ordered.HIGHEST_PRECEDENCE标记具有最高优先级的Spring bean。
为什么使用?
@Order批注的一些常见用例包括:
- 在AspectJ中订购建议; 最初引入它的真正意图
- 当我们想定义加载CommandLineRunner或ApplicationRunner类的顺序时
- 用于以有序方式在Java数组或List中注入bean 列表
- 在Spring Security的情况下定义过滤器执行的顺序
设置示例:
假设我们有一个Vehicle界面:
public interface Vehicle {public String getDetails();
}
我们定义了一些实现类:
@Order(1)
@Component
public class Bike implements Vehicle {public String getDetails() {return "Bike: 2 Wheeler";}
}@Order(2)
@Component
public class Car implements Vehicle {public String getDetails() {return "Car: 4 Wheeler";}
}@Order(3)
@Component
public class Truck implements Vehicle {public String getDetails() {return "Truck: 6 Wheeler";}
}
在这里,我们已经订购了所有这三个Spring组件。 Bike bean的优先级最高,其次是Car ,最后是Truck 。
测试我们的实施:
让我们快速编写一个Junit来看看它是如何工作的:
@RunWith(SpringRunner.class)
@SpringBootTest
public class SampleAppTest {@Autowiredprivate List<Vehicle> vehicles;@Testpublic void testSpringOrderAnnotation() {assertThat(vehicles.get(0).getDetails(), isEqual("Bike: 2 Wheeler"));assertThat(vehicles.get(1).getDetails(), isEqual("Car: 4 Wheeler"));assertThat(vehicles.get(2).getDetails(), isEqual("Truck: 6 Wheeler"));}
}
显然, Spring根据其优先级将我们的bean自动连接到了车辆 Java List中 。
结论
在本微型教程中,我们探讨了Spring @Order批注的用法。
翻译自: https://www.javacodegeeks.com/2019/09/spring-order-annotation.html