【源码】Spring validation参数校验实现原理总结

04-27 1126阅读

 Spring validation参数校验系列

【源码】Spring validation参数校验实现原理总结
(图片来源网络,侵删)

1、Spring validation参数校验基本使用

2、Spring validation参数校验之自定义校验规则及编程式校验等进阶篇

3、【源码】Spring validation参数校验原理解析之Controller控制器参数校验中@RequestBody参数校验实现原理

4、【源码】Spring validation参数校验原理解析之Controller控制器参数校验中@ModelAttribute及实体类参数校验实现原理

5、【源码】Spring validation参数校验原理解析之基本类型参数及Service层方法参数校验实现原理

6、【源码】Spring validation校验的核心类ValidatorImpl、MetaDataProvider和AnnotationMetaDataProvider源码分析

7、Spring validation参数校验高级篇之跨参数校验Cross-Parameter及分组序列校验@GroupSequenceProvider、@GroupSequence

8、【源码】Spring validation参数校验之跨参数校验Cross-Parameter原理分析

9、【源码】Spring validation参数校验之分组序列校验@GroupSequenceProvider、@GroupSequence的实现原理

10、【源码】Spring validation参数校验实现原理总结

前言

Spring validation的校验核心部分采用的是Hibernate validation,而Hibernate validation的设计比较复杂,《Spring validation参数校验系列》文章用了六篇来讲解Spring/Hibernate validation的源码。由于篇幅限制,要一次性全部分析清楚很困难,每一篇只在尽量保证讲清楚对应篇章核心内容的前提下,穿插引入一些细节。在这一篇中,准备对源码做一个总结,从整体的角度来熟悉一下Sprign validation参数校验的整体结构。

一、参数约束解析

通过BeanMetaDataManager.getBeanMetaData(Class beanClass)获得beanClass添加的约束元数据BeanMetaDataImpl对象。

BeanMetaDataManager的实现类为BeanMetaDataManagerImpl。在BeanMetaDataManagerImpl中,维护一个ConcurrentReferenceHashMap> beanMetaDataCache属性,缓存某个beanClass的约束元数据。如果没在缓存中,则调用createBeanMetaData(Class clazz),创建解析创建约束元数据。

BeanMetaDataManagerImpl.createBeanMetaData(Class clazz)的源码如下:

    private  BeanMetaDataImpl createBeanMetaData(Class clazz) {
		BeanMetaDataBuilder builder = BeanMetaDataBuilder.getInstance(
				constraintCreationContext, executableHelper, parameterNameProvider,
				validationOrderGenerator, clazz, methodValidationConfiguration );
 
		for ( MetaDataProvider provider : metaDataProviders ) {
			// getBeanConfigurationForHierarchy()方法遍历beanClass及其父类,调用AnnotaionMetaDataProvider.getBeanConfiguration()方法
			// 获取对应类添加的约束注解,封装成BeanConfiguration对象
			for ( BeanConfiguration[] groups),其中的groups为validate()方法中传入的,为@Validated注解中添加的,默认为Default分组。该方法调用validationOrderGenerator.getValidationOrder( resultGroups )获取分组顺序。详见 
 
 

【源码】Spring validation参数校验之分组序列校验@GroupSequenceProvider、@GroupSequence的实现原理-CSDN博客

2.3.4 执行validateInContext(BaseBeanValidationContext validationContext, BeanValueContext valueContext, ValidationOrder validationOrder),进行参数校验;

2.3.4.1 判断是否添加了分组序列,如果有,且有动态分组系列程序DefaultGroupSequenceProvider,则会再次执行DefaultGroupSequenceProvider.getValidationGroups()方法,动态获取分组;

2.3.4.2 遍历分组,调用validateConstraintsForCurrentGroup(BaseBeanValidationContext validationContext, BeanValueContext validationContext, ValueContext validationContext, BeanValueContext validationContext, BeanValueContext validationContext, ValueContext metaConstraint)完成真正的校验;

2.3.4.4.1 执行valueContext.setCurrentValidatedValue(valueContext.getValue(parent, metaConstraint.getLocation())),通过MetaConstraint中的location获取传入约束校验器ConstraintValidator.isValid()方法的参数值;

2.3.4.4.2 执行ConstraintTree.getInitializedConstraintValidator()获取对应约束的ConstraintValidator对象,首次获取会调用初始化方法;

2.3.4.4.3 执行ConstraintTree.validateSingleConstraint()方法,调用ConstraintValidator的isValid()方法进行参数校验;

2.3.4.4.4 如果有设置了快速失败,则只要其中一个校验失败,校验就结束;

详见

【源码】Spring validation参数校验之分组序列校验@GroupSequenceProvider、@GroupSequence的实现原理-CSDN博客

【源码】Spring validation参数校验原理解析之Controller控制器参数校验中@RequestBody参数校验实现原理_simpleconstrainttree-CSDN博客

结尾

《Spring validation参数校验系列》文章花了很多篇幅从源码的角度讲解Spring validation的实现,由于Hibernate validation设计比较复杂,本人才疏学浅,许多细节也没有全部研究透。

关于本篇内容你有什么自己的想法或独到见解,欢迎在评论区一起交流探讨下吧。

VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]