当前位置: 首页 > news >正文

@Order详解 | Spring

@Order注解详解

先说结论:

在@Order注解中,值越小优先级越高,越先执行

默认值Integer.MAX_VALUE

一、基本用法

// 值小的先执行
@Order(1)
public class FirstFilter implements Filter {@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {System.out.println("First Filter");chain.doFilter(request, response);}
}@Order(2)
public class SecondFilter implements Filter {@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {System.out.println("Second Filter");chain.doFilter(request, response);}
}// 执行顺序:
// 1. First Filter
// 2. Second Filter

二. 常见使用场景:

1、过滤器排序

@Configuration
public class FilterConfig {@Bean@Order(1)public FilterRegistrationBean<SecurityFilter> securityFilter() {// 安全过滤器最先执行return new FilterRegistrationBean<>(new SecurityFilter());}@Bean@Order(2)public FilterRegistrationBean<LoggingFilter> loggingFilter() {// 日志过滤器第二个执行return new FilterRegistrationBean<>(new LoggingFilter());}@Bean@Order(3)public FilterRegistrationBean<EncodingFilter> encodingFilter() {// 编码过滤器最后执行return new FilterRegistrationBean<>(new EncodingFilter());}
}

2、切面排序

@Aspect
@Order(1)
@Component
public class LoggingAspect {// 日志切面先执行
}@Aspect
@Order(2)
@Component
public class TransactionAspect {// 事务切面后执行
}

3、事件监听器排序:

@Component
@Order(1)
public class EmailNotificationListener implements ApplicationListener<UserRegisteredEvent> {// 邮件通知优先处理
}@Component
@Order(2)
public class SmsNotificationListener implements ApplicationListener<UserRegisteredEvent> {// 短信通知后处理
}

三、特殊值

@Component
@Order(1)
public class EmailNotificationListener implements ApplicationListener<UserRegisteredEvent> {// 邮件通知优先处理
}@Component
@Order(2)
public class SmsNotificationListener implements ApplicationListener<UserRegisteredEvent> {// 短信通知后处理
}

四、注意事项

1、默认值

@Order  // 默认值是 Ordered.LOWEST_PRECEDENCE
public class DefaultOrderFilter implements Filter {// 没有指定顺序时,默认最后执行
}

2、相同顺序

@Order(1)
public class FilterA implements Filter {// 相同顺序的执行顺序不确定
}@Order(1)
public class FilterB implements Filter {// 相同顺序的执行顺序不确定
}

3、组合使用

@Configuration
@Order(1)  // 配置类的加载顺序
public class SecurityConfig {@Bean@Order(1)  // Bean的初始化顺序public SecurityFilter securityFilter() {return new SecurityFilter();}
}

五、最佳实践

1、使用常量定义顺序

public class OrderConstants {public static final int SECURITY_FILTER_ORDER = 100;public static final int LOGGING_FILTER_ORDER = 200;public static final int ENCODING_FILTER_ORDER = 300;
}@Order(OrderConstants.SECURITY_FILTER_ORDER)
public class SecurityFilter implements Filter {// 使用常量便于维护
}

2、预留空间

// 预留足够的间隔,方便后续插入新的顺序
@Order(100)  // 安全过滤
@Order(200)  // 日志过滤
@Order(300)  // 编码过滤

3、文档化

/*** 安全过滤器* 执行顺序:1* 职责:处理安全相关的请求过滤*/
@Order(1)
public class SecurityFilter implements Filter {// 添加清晰的文档说明
}

六、总结:

值越小,优先级越高

相同值的执行顺序不确定

建议使用常量管理顺序值

预留足够的顺序间隔

添加必要的文档说明

使用建议:

安全相关的组件优先级设置高一些

使用有意义的顺序值

避免使用相同的顺序值

合理规划执行顺序


http://www.mrgr.cn/news/66728.html

相关文章:

  • Python中的PDF处理工具:PyPDF2和ReportLab使用指南
  • JeecgBoot入门
  • WCY的比赛题解
  • 惊呆:where 1=1 可能严重影响性能,差了10多倍,快去排查你的 sql
  • HTMLCSS:3D 旋转卡片的炫酷动画
  • 62-Java-面试专题(1)__基础
  • 【SQLmap全选项参数】
  • Oracle 第25章:Oracle GoldenGate
  • 【Linux系统编程】第四十二弹---多线程编程全攻略:涵盖线程创建、异常处理、用途、进程对比及线程控制
  • qt QAbstractTableModel详解
  • 摩尔线程嵌入式面试题及参考答案(2万字长文)
  • java中的switch语句有哪些限制?
  • C++__XCode工程中Debug版本库向Release版本库的切换
  • 期权定价的一个例子
  • TikTok不符合推荐页资格是为什么?该如何解决?
  • uni-app 图标库整合最佳实践:使用 iconfont 构建属于自己的图标库
  • 传统媒体终端移动化发展新趋势:融合开源 AI 智能名片与 S2B2C 商城小程序的创新探索
  • docker-compose.yml 文件来配置 Redis
  • Python小白学习教程从入门到入坑------第二十六课 单例模式(语法进阶)
  • JAVA学习-练习试用Java实现“斐波那契数列”
  • 微服务架构面试内容整理-Zuul
  • 计算机组成原理之异常和中断的检测与响应
  • 从零开始注册邮箱,掌握个人数字通信金钥匙
  • Rust常用数据结构教程 String与str,元组和数组
  • 第十二章 本地进程间通信(管道) - OPEN 和 USE 命令关键字
  • 守住数据安全的第一道防线——权限管理全解析