@Order(Ordered.HIGHEST_PRECEDENCE)
是Spring框架中的一个注解,用于指定组件或bean的优先级。它通常用于当Spring需要排序多个组件时,以确定它们的执行顺序。
Ordered
是一个接口,它定义了一个 getOrder()
方法,该方法返回一个 int
值,表示组件的优先级。Ordered.HIGHEST_PRECEDENCE
是这个接口中的一个静态常量,通常具有最高的优先级值(通常是一个负整数,如 -Integer.MAX_VALUE
)。
Ordered
接口定义如下:
package org.springframework.core;
public interface Ordered {
int HIGHEST_PRECEDENCE = Integer.MIN_VALUE;
int LOWEST_PRECEDENCE = Integer.MAX_VALUE;
int getOrder();
}
其中,声明了优先级的最大值 HIGHEST_PRECEDENCE 和最小值 LOWEST_PRECEDENCE,分别对应整数数据类型的最大值、最小值。
因此可以在 @Order 注解中直接写一个整数来指定Bean的顺序号,如 @Order(10),其中数字越大,优先级越高。
当你在一个bean或组件上添加 @Order(Ordered.HIGHEST_PRECEDENCE)
注解时,你实际上是在告诉Spring这个bean应该具有最高的优先级。这在处理过滤器、拦截器、事件监听器、配置类等方面特别有用,当Spring需要按照特定的顺序执行这些组件时。
例如,在Spring WebFlux或Spring MVC中,如果你有多个过滤器或拦截器,并且它们的执行顺序很重要,你可以使用 @Order
注解来指定它们的优先级。
这里是一个简单的例子,展示了如何在Spring MVC的拦截器中使用 @Order
注解:
@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
public class MyInterceptor implements HandlerInterceptor {
// ... 实现拦截器的方法 ...
}
在这个例子中,MyInterceptor
将具有最高的执行优先级,这意味着在所有其他没有指定优先级的拦截器之前,它将被首先执行。
下面是在配置类中使用的例子:
@Configuration
public class GatewayConfig {
private final List<ViewResolver> viewResolvers;
private final ServerCodecConfigurer serverCodecConfigurer;
@Bean
@Order(Ordered.HIGHEST_PRECEDENCE)
public SentinelGatewayBlockExceptionHandler sentinelGatewayBlockExceptionHandler() {
// Register the block exception handler for Spring Cloud Gateway.
// 注册异常处理器,阻断异常打开的视图
return new SentinelGatewayBlockExceptionHandler(viewResolvers,
serverCodecConfigurer);
}
}