可实现轻量校验框架:定义标准约束注解并自研验证器,结合反射扫描与元数据缓存,支持声明式校验、分组、错误聚合与扩展,比 Hibernate Validator 更简洁可控。

直接用注解 + 反射实现一个能替代 Hibernate Validator 的轻量校验框架,核心不在于“重写所有功能”,而在于抓住关键场景:声明式校验、运行时触发、错误聚合、可扩展约束。它完全可以比 Hibernate Validator 更简洁、更可控,尤其适合内部工具、微服务基础组件或对启动耗时敏感的场景。
一、定义约束注解,对标 JSR-303 语义
不重复造轮子,复用 JSR-303 标准注解命名与基本语义(如 @NotNull、@Size、@Pattern),但自己实现,避免依赖 hibernate-validator 或 validation-api 的庞大体系。只需定义几个最常用注解,并支持 message、groups、payload 等标准属性:
- 用
@Target({FIELD, METHOD})和@Retention(RUNTIME)声明运行时可用 - 每个注解配一个对应的 ConstraintValidator 实现类(如
NotNullValidator),负责具体逻辑 - 支持分组校验:用
Class[] groups() default {},运行时按需匹配
二、反射扫描 + 缓存校验元数据,避免每次重复解析
首次校验某个类时,用反射遍历其字段/方法,提取所有约束注解,构建轻量 ValidationMeta 对象并缓存(例如用 ConcurrentHashMap)。后续校验直接查缓存,跳过反射开销:
-
ConstraintInfo包含字段名、注解实例、对应 validator 实例、所属分组等 - 支持嵌套对象递归:遇到
@Valid注解时,自动触发子对象校验(同样走缓存路径) - 忽略静态字段、瞬态字段(可加
@Transient或按命名约定过滤)
三、统一校验入口与错误收集机制
提供一个无状态的 Validator 类,暴露 validate(Object obj) 和 validate(Object obj, Class>... groups) 方法:
- 执行时按分组筛选约束,逐个调用对应
ConstraintValidator#isValid() - 错误不抛异常,而是收集为
ConstraintViolation列表(含字段路径、消息、无效值、约束注解类型) - 支持自定义 message 插值:用简单占位符(如
{min}、{value})+MessageInterpolator接口,无需完整 EL 表达式引擎
四、可插拔与轻量扩展设计
整个框架核心代码可控制在 500 行以内。扩展性通过接口而非继承保障:
- 新增约束:只写一个注解 + 一个
ConstraintValidator实现,注册到全局ValidatorFactory - 替换消息源:实现
MessageSource接口,支持 properties 文件、数据库或动态配置 - 适配 Spring:写一个
SpringConstraintValidator包装器,集成到LocalValidatorFactoryBean流程中,零侵入
不需要 AST 解析、不依赖字节码增强、不启动代理、不扫描 classpath —— 纯反射 + 注解 + 接口,启动快、内存省、逻辑透明。真正需要的,只是把“校验逻辑”和“校验声明”解耦,再用一次反射把它们连起来。










