Spring BootでSpring Validationの働き方
4323 ワード
validationはjavaxで定義されている認証インターフェースのセットです.今、私たちがよく知っている実現はヒッバーナのvalidationです.
問題1、springbootでvalidationはどのように導入されましたか?
問題2、 スプリングの中でvalidationの検証はどうやって実現しますか?
MethodValidation PostProcessorはInitializingBeanインターフェースを実現します.
はい、ここに書きます.もし間違いがあれば、コメントしてください.助けてください.
問題1、springbootでvalidationはどのように導入されましたか?
問題2、 スプリングの中でvalidationの検証はどうやって実現しますか?
// bean
@Configuration
@ConditionalOnClass(ExecutableValidator.class)
@ConditionalOnResource(resources = "classpath:META-INF/services/javax.validation.spi.ValidationProvider")
@Import(PrimaryDefaultValidatorPostProcessor.class)
public class ValidationAutoConfiguration {
// bean , ServiceLoader jar classpath:META-INF/services/javax.validation.spi.ValidationProvider,
// hibernate validation ,
// messageInterpolatorFactory ,
@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;
}
// ,
// BeanPostProcessor#postProcessAfterInitialization
// bean annotation (@Validated) ,
// AOP ,
@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;
}
}
問題2、私たちは具体的にはMethodValidation PostProcessorというbeanの重要なソースコードを見に来ました.MethodValidation PostProcessorはInitializingBeanインターフェースを実現します.
@Override
public void afterPropertiesSet() {
/** Aop , Annotation org.springframework.validation.annotation.Validated
*
* :
* 1》 this.classFilter = new AnnotationClassFilter(classAnnotationType, checkInherited); *@Validated
* 2》 this.methodMatcher = MethodMatcher.TRUE;
**/
Pointcut pointcut = new AnnotationMatchingPointcut(this.validatedAnnotationType, true);
/**
MethodValidationInterceptor
**/
this.advisor = new DefaultPointcutAdvisor(pointcut, createMethodValidationAdvice(this.validator));
}
/**
* Create AOP advice for method validation purposes, to be applied
* with a pointcut for the specified 'validated' annotation.
* @param validator the JSR-303 Validator to delegate to
* @return the interceptor to use (typically, but not necessarily,
* a {@link MethodValidationInterceptor} or subclass thereof)
* @since 4.2
*/
protected Advice createMethodValidationAdvice(@Nullable Validator validator) {
return (validator != null ? new MethodValidationInterceptor(validator) : new MethodValidationInterceptor());
}
また、その親タイプのAbstractAdvisigBenPostProcessorがBeanPostProcessorインターフェースを実現しましたので、具体的な実現方法を見てみます.@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) {
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) {
if (this.advisor == null || bean instanceof AopInfrastructureBean) {
// Ignore AOP infrastructure such as scoped proxies.
return bean;
}
if (bean instanceof Advised) {
Advised advised = (Advised) bean;
if (!advised.isFrozen() && isEligible(AopUtils.getTargetClass(bean))) {
// Add our local Advisor to the existing proxy's Advisor chain...
if (this.beforeExistingAdvisors) {
advised.addAdvisor(0, this.advisor);
}
else {
advised.addAdvisor(this.advisor);
}
return bean;
}
}
if (isEligible(bean, beanName)) {
ProxyFactory proxyFactory = prepareProxyFactory(bean, beanName);
if (!proxyFactory.isProxyTargetClass()) {
evaluateProxyInterfaces(bean.getClass(), proxyFactory);
}
proxyFactory.addAdvisor(this.advisor);
customizeProxyFactory(proxyFactory);
return proxyFactory.getProxy(getProxyClassLoader());
}
// No proxy needed.
return bean;
}
この方法はプロキシクラスを生成します.(容器内に構築されたbeanをスキャンし、プロキシクラスを生成します.)はい、ここに書きます.もし間違いがあれば、コメントしてください.助けてください.