@order注解用于指定spring中同类组件的执行优先级,数值越小越先执行,适用于handlerinterceptor、filter、@aspect、beanpostprocessor等有序扩展点,不控制bean初始化顺序。

@Order 注解在 Spring 中用于指定组件(如 Bean、拦截器、过滤器、切面等)的执行优先级,数值越小优先级越高,先执行。它本身不直接控制“启动顺序”,而是影响 Spring 容器中多个同类组件被调用时的排列顺序,比如多个 HandlerInterceptor、Filter、BeanPostProcessor 或 @Aspect 切面。
哪些地方能用 @Order?
不是所有 Bean 都会受 @Order 影响,只有参与“有序链式调用”的扩展点才生效:
- Web 层:实现了
HandlerInterceptor的拦截器 - Servlet 层:实现了
Filter的过滤器(需配合@WebFilter或注册为 Bean) - AOP:使用
@Aspect的切面(影响增强执行顺序) - 容器扩展:实现
BeanPostProcessor、ApplicationContextInitializer、CommandLineRunner、ApplicationRunner - 消息处理:如
ChannelInterceptor、MessageHandler等(Spring Integration / AMQP 场景)
怎么写 @Order?
有两种常用写法:
-
@Order(1):传入整型值,数字越小越靠前。例如@Order(0)比@Order(10)优先级高 -
@Order(Ordered.HIGHEST_PRECEDENCE):使用常量,等价于@Order(Integer.MIN_VALUE),最高优先级 -
@Order(Ordered.LOWEST_PRECEDENCE):最低优先级(Integer.MAX_VALUE)
注意:@Order 必须和 @Component、@Service、@Configuration 或 @Bean 方法一起使用才有效;单独加在普通类上无意义。
和 @Priority 有什么区别?
@Priority 是 JSR-330 标准注解(javax.annotation.Priority),Spring 也支持,功能类似 @Order,但仅适用于部分场景(如 BeanPostProcessor),且不能用于 @Aspect 或 HandlerInterceptor。推荐统一用 @Order,更通用、更明确。
常见误区提醒
-
不控制 Bean 初始化顺序:想让 A 在 B 之前初始化,请用
@DependsOn("b")或构造注入依赖,而不是@Order -
同优先级行为不确定:多个相同
@Order值的组件,执行顺序由 Spring 内部注册顺序决定,不保证稳定,应避免 -
WebMvcConfigurer 中添加的拦截器需显式设置顺序:通过
registry.addInterceptor(...).order(1)设置,而非在拦截器类上加@Order(除非是直接注册为 Bean) -
Filter 在 Servlet 容器中默认无序:若用
@WebFilter,需配置filterRegistrationBean.setOrder();若声明为@Bean,则@Order生效









