Spring Boot 自动配置 : ValidationAutoConfiguration
概述ValidationAutoConfiguration是Spring Boot对应用中验证机制的自动配置。它主要向容器贡献了两个bean :LocalValidatorFactoryBean defaultValidator这其实就是一般意义上所说的Validator bean仅在容器中不存在类型为Validator的bean时才定义,也就是说如果开发人员自己定义了Validat...
·
概述
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;
}
}
参考文章
更多推荐
已为社区贡献14条内容
所有评论(0)