Java注解路由分发核心是“声明即配置、扫描即注册、调用即路由”闭环:定义类/方法/参数三级注解,启动时扫描注册为action→method映射表,运行时依action查表、绑定参数并反射调用,辅以AOP拦截、灰度路由等扩展能力。

Java 注解实现路由分发,核心是用注解标记意图、用反射扫描注册、用运行时逻辑完成分发。它不是简单加几个注解就完事,而是围绕“声明即配置、扫描即注册、调用即路由”这一闭环来构建轻量可控的框架能力。
定义语义清晰的注解
注解是路由系统的“契约语言”,必须明确作用目标和生命周期:
- 类级注解(如 @Service)用于标识可被扫描的组件容器,@Target(ElementType.TYPE) + @Retention(RetentionPolicy.RUNTIME)
- 方法级注解(如 @Actioner(action = "login"))承载路由键,需强制指定 action 属性,@Target(ElementType.METHOD)
- 参数级注解(如 @AParameter(name = "username"))支撑动态绑定,便于从请求中提取并注入对应参数
- 避免滥用 @Target(ElementType.ANNOTATION_TYPE) 或通配类型;不加 @Retention(RUNTIME) 的注解在运行时不可见,无法支撑反射调度
扫描与注册:构建路由映射表
启动时扫描带有特定注解的类与方法,生成 action → method 映射关系,这是分发器的“路由表”:
- 遍历 classpath 下所有类,过滤出含 @Service 的类,实例化对象
- 对每个实例,反射获取所有 public 方法,检查是否标注 @Actioner,提取 action() 值作为 key
- 将 method、所属对象、参数元信息(通过 Method.getParameters() 获取)封装为 ActionDefinition,存入 ConcurrentHashMap
- 建议加入缓存机制(如 Caffeine),避免每次请求都重复反射解析
运行时分发:从请求到方法执行
收到请求后,根据 action 字符串查表、构造参数、反射调用,全程需处理异常与类型转换:
立即学习“Java免费学习笔记(深入)”;
- 从请求体或查询参数中提取 action 值(例如 HTTP POST body 中的 {"action":"updateUser","data":{...}})
- 查路由表获取对应 ActionDefinition;若不存在,返回统一错误码(如 404 或 UNKNOWN_ACTION)
- 遍历其 paramerterList,结合 @AParameter 的 name,从请求数据中匹配赋值;支持基本类型自动转换(String → int/long)、JSON 反序列化(如 Jackson)
- 调用 method.invoke(object, args);捕获 InvocationTargetException 并包装为业务异常,避免堆栈暴露内部细节
扩展性设计:支持拦截、灰度与多维路由
生产级路由不能只做简单转发,需预留扩展点:
- 用 AOP 切面(如 @Around)包裹路由执行,插入鉴权、日志、耗时统计等横切逻辑
- 引入灰度注解(如 @GrayRoute(strategy = "userIdMod")),在分发前判断当前请求是否命中灰度规则,决定走新逻辑还是旧逻辑
- 数据库路由场景下,可复用类似思路:定义 @DBRouter(key = "userId"),在 DAO 方法执行前,根据参数值计算库表索引,切换数据源
- 避免把所有逻辑塞进一个 Dispatcher 类;按职责拆分——扫描器、注册器、分发器、参数解析器各司其职



















