概述
ValidationAutoConfiguration是Spring Boot对应用中验证机制的自动配置。它主要向容器贡献了两个bean :
-
LocalValidatorFactoryBean defaultValidator- 这其实就是一般意义上所说的
Validator bean - 仅在容器中不存在类型为
Validator的bean时才定义,也就是说如果开发人员自己定义了Validator bean,则这里不定义 - 该定义确保容器中总是会有一个
Validator bean
这个
Validator bean是基础性组件,应用中更上层的验证逻辑,比如基于JSR-303注解的bean属性和方法参数的验证,都是使用该Validator bean组件。 - 这其实就是一般意义上所说的
-
MethodValidationPostProcessor methodValidationPostProcessor- 这是一个
BeanPostProcessor,它会检测所有带有注解@Validated的bean定义,使用一个带有方法参数验证逻辑的MethodValidationPostProcessor包裹这样的每个bean(必要时会触发bean代理对象的创建)。 - 仅在容器中不存在该类型的
bean时才定义 - 所使用的
Validator bean来自容器,如果开发人员未定义Validator bean,则所使用的Validator bean就是本自动配置所定义的Validator bean
- 这是一个
ValidationAutoConfiguration自动配置仅在检测到classpath上存在文件META-INF/services/javax.validation.spi.ValidationProvider和类javax.validation.executable.ExecutableValidator时才应用,因为这两个文件/类表明开发人员引入了相应的Validation Provider jar包。
源代码
源代码版本 : spring-boot-autoconfigure-2.1.3.RELEASE
package org.springframework.boot.autoconfigure.validation;
import javax.validation.Validator;
import javax.validation.executable.ExecutableValidator;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnResource;
import org.springframework.boot.validation.MessageInterpolatorFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.Lazy;
import org.springframework.context.annotation.Role;
import org.springframework.core.env.Environment;
import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean;
import org.springframework.validation.beanvalidation.MethodValidationPostProcessor;
/**
* EnableAutoConfiguration Auto-configuration to configure the validation
* infrastructure.
*
* @author Stephane Nicoll
* @author Madhura Bhave
* @since 1.5.0
*/
@Configuration
@ConditionalOnClass(ExecutableValidator.class)
@ConditionalOnResource(resources = "classpath:META-INF/services/javax.validation.spi.ValidationProvider")
@Import(PrimaryDefaultValidatorPostProcessor.class)
public class ValidationAutoConfiguration {
// 向容器注册一个 bean LocalValidatorFactoryBean defaultValidator,
// 仅在容器中不存在类型为 Validator 的 bean时才注册该bean定义
// 这是Spring 框架各部分缺省使用的 validator , 基于对象属性上的验证注解验证对象属性值
@Bean
@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
@ConditionalOnMissingBean(Validator.class)
public static LocalValidatorFactoryBean defaultValidator() {
LocalValidatorFactoryBean factoryBean = new LocalValidatorFactoryBean();
MessageInterpolatorFactory interpolatorFactory = new MessageInterpolatorFactory();
factoryBean.setMessageInterpolator(interpolatorFactory.getObject());
return factoryBean;
}
// 向容器注册一个 bean MethodValidationPostProcessor methodValidationPostProcessor
// 这是一个 BeanPostProcessor, 它基于容器中存在的 bean Validator构建一个 MethodValidationInterceptor,
// 这是一个方法调用拦截器,然后该 BeanPostProcessor 会为那些使用了注解 @Validated 的 bean
// 创建代理对象,并使用所创建的 MethodValidationInterceptor 包裹该 bean,从而能够在方法调用时
// 对 bean 的方法参数进行验证
@Bean
@ConditionalOnMissingBean
public static MethodValidationPostProcessor methodValidationPostProcessor(
Environment environment, @Lazy Validator validator) {
MethodValidationPostProcessor processor = new MethodValidationPostProcessor();
boolean proxyTargetClass = environment
.getProperty("spring.aop.proxy-target-class", Boolean.class, true);
processor.setProxyTargetClass(proxyTargetClass);
processor.setValidator(validator);
return processor;
}
}

本文介绍Spring Boot如何通过ValidationAutoConfiguration自动配置验证机制。主要内容包括LocalValidatorFactoryBean和MethodValidationPostProcessor的注入条件及作用,前者用于提供基础验证功能,后者负责对带有@Validated注解的bean进行方法参数验证。
5254

被折叠的 条评论
为什么被折叠?



