一、基本介绍SpringBoot提供了方便的validation主要对输入数据进行校验确保数据符合预期规则是保证应用健壮性的重要手段1、Bean Validation基于 JSR-380 (Bean Validation 2.0) 规范、2、Hibernate Validator最流行的实现3、Spring 集成通过 Valid 或 Validated 注解触发验证怎么使用就不介绍了包含如何自定义注解进行校验分组验证处理验证错误二、javax.validation这里项目jdk为1.8所使用的包名为javax.validation之后的版本变更为jakarta.validation这个包为Jakarta EE平台的基础核心包之一提供验证bean标准的API,总入口为Validation类作为标准的api需要暴露接口供其他包进行接入接口为ValidationProviderValidationProvider通过ValidationProviderResolver进行处理除此之外javax.validation提供了默认的处理器DefaultValidationProviderResolver会通过SPI机制ServiceLoader加载META-INF/services/如果未加载到则会抛出异常否则会取第一个ValidationProvider最终通过configure生成javax.validation.ConfigurationConfiguration也提供了非常多的接口层定义需要实现buildValidatorFactory再通过ValidatorFactory.getValidator进行校验javax.validation提供了一些基础的校验注解具体校验规则也需要单独实现三、hibernate实现首先在META-INF/services目录下申明javax.validation.spi.ValidationProvider为org.hibernate.validator.HibernateValidatorHibernateValidator生成的configuration为HibernateValidatorConfigurationValidatorFactory的实现为ValidatorFactoryImpl其中含有几个重要的属性1、ConstraintValidatorFactory负责ConstraintValidator的创建和生命周期通过工厂获取某个校验的ConstraintValidator实例如果是spring项目使用的是SpringConstraintValidatorFactory有springframework负责实现2、校验逻辑直到开始校验时才会执行Validator.validate方法这里以分组校验对象为例Validator也提供了很多种灵活的校验包括校验单独的某个属性其中BeanMetaData主要通过AnnotationMetaDataProvoder进行注解的元数据获取主要思路为根据constraintHelper.isConstraintAnnotation是否当前类含有校验属性的注解Constraint.class因为基本上每个校验注解里面都有Constraint如果没有任何约束条件则会直接结束同时BeanMetaData进行了缓存下一次校验同类型的时候直接从缓存获取metaData紧接着会对校验的组进行排序每次校验可以支持单个或者多个如果未指定默认是javax.validation.groups.Default最后会执行validateInContext进行校验其中短路验证shouldFailFast是hibernate专有的如果开启了这个属性遇到验证失败的则会直接结束不再往下执行这里就会用到提供的接口所有实现ConstraintValidator调用isValid方法