抄底券网站怎么做的,网站效果图用什么做,上海专业网站建设 公司,制作网站注册页面模板Spring Boot组件化与参数校验
Spring Boot版本选择 2.3.x版本 2.6.x版本
Spring Boot核心思想
约定大于配置#xff0c;简化繁琐的配置
Spring Boot自动配置原理 SpringBootApplication: Spring Boot应用标注在某个类上说明这个类是SpringBoot的主配置类#xff0c;Spr…Spring Boot组件化与参数校验
Spring Boot版本选择 2.3.x版本 2.6.x版本
Spring Boot核心思想
约定大于配置简化繁琐的配置
Spring Boot自动配置原理 SpringBootApplication: Spring Boot应用标注在某个类上说明这个类是SpringBoot的主配置类SpringBoot需要运行这个类的main方法来启动SpringBoot应用 SpringBootApplication Target(ElementType.TYPE)
Retention(RetentionPolicy.RUNTIME)
Documented
Inherited
SpringBootConfiguration
EnableAutoConfiguration
ComponentScan(excludeFilters {Filter(type FilterType.CUSTOM, classes TypeExcludeFilter.class),Filter(type FilterType.CUSTOM, classes AutoConfigurationExcludeFilter.class) })
public interface SpringBootApplication {SpringBootConfiguration:Spring Boot的配置类 标注在某个类上表示这是一个Spring Boot的配置类 Configuration:配置类上来标注这个注解 配置类 ----- 配置文件配置类也是容器中的一个组件本质上是Component EnableAutoConfiguration开启自动配置功能 以前我们需要配置的东西Spring Boot帮我们自动配置EnableAutoConfiguration告诉SpringBoot开启自动配置会帮我们自动去加载 自动配置类 ComponentScan 扫描包 相当于在spring.xml 配置中context:component-scan 但是并没有指定basepackage如果没有指定spring底层会自动扫描当前配置类所有在的包。TypeExcludeFilterspringboot对外提供的扩展类 可以供我们去按照我们的方式进行排除去找到所有自定义的TypeExcludeFilter的bean调用match方法满足一个则排除。AutoConfigurationExcludeFilter排除当前类路径下所有Configuration修饰的类并且是自动配置的类spring.factories中EnableAutoConfiguration配置了就是自动配置类 EnableAutoConfiguration
Target(ElementType.TYPE)
Retention(RetentionPolicy.RUNTIME)
Documented
Inherited
AutoConfigurationPackage
Import(AutoConfigurationImportSelector.class)
public interface EnableAutoConfiguration {// 略
}AutoConfigurationPackage 将当前配置类所在包保存在BasePackages的Bean中。供Spring内部使用。 Import(AutoConfigurationImportSelector.class) 关键点 可以看到在EnableAutoConfiguration注解内使用到了import注解来完成导入配置的功能而AutoConfigurationImportSelector实现了DeferredImportSelectorSpring延迟到项目beanDefinition已经全被扫描完才去执行selectImports,内部在解析Import注解时会调用getAutoConfigurationEntry方法。 下面是2.3.5.RELEASE实现源码getAutoConfigurationEntry方法进行扫描具有META-INF/spring.factories文件的jar包。
protected AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata annotationMetadata) {if (!isEnabled(annotationMetadata)) {return EMPTY_ENTRY;}AnnotationAttributes attributes getAttributes(annotationMetadata);// 从META-INF/spring.factories中获得候选的自动配置类ListString configurations getCandidateConfigurations(annotationMetadata, attributes);// 排重configurations removeDuplicates(configurations);//根据EnableAutoConfiguration注解中属性获取不需要自动装配的类名单// 根据:EnableAutoConfiguration.exclude// EnableAutoConfiguration.excludeName// spring.autoconfigure.exclude 进行排除SetString exclusions getExclusions(annotationMetadata, attributes); // 检查如果exclusions排除的类不在自动配置类configurations里抛出异常checkExcludedClasses(configurations, exclusions);// exclusions 也排除configurations.removeAll(exclusions);// 通过读取spring.factories 中AutoConfigurationImportFilter的配置类OnBeanCondition\OnClassCondition\OnWebApplicationCondition实例化进行过滤configurations getConfigurationClassFilter().filter(configurations);// 通过读取spring.factories 中的AutoConfigurationImportListener类实例化可以支持处理AutoConfigurationImportEvent的事件// 分别把候选的配置名单和排除的配置名单传进去做扩展fireAutoConfigurationImportEvents(configurations, exclusions);return new AutoConfigurationEntry(configurations, exclusions);
}Conditional派生注解Spring注解版原生的Conditional作用
作用必须是Conditional指定的条件成立才给容器中添加组件配置配里面的所有内容才生效
Conditional扩展注解作用判断是否满足当前指定条件ConditionalOnJava系统的java版本是否符合要求ConditionalOnBean容器中存在指定BeanConditionalOnMissingBean容器中不存在指定BeanConditionalOnExpression满足SpEL表达式指定ConditionalOnClass系统中有指定的类ConditionalOnMissingClass系统中没有指定的类ConditionalOnSingleCandidate容器中只有一个指定的Bean或者这个Bean是首选BeanConditionalOnProperty系统中指定的属性是否有指定的值ConditionalOnResource类路径下是否存在指定资源文件ConditionalOnWebApplication当前是web环境ConditionalOnNotWebApplication当前不是web环境ConditionalOnJndiJNDI存在指定项
我们可以通过设置配置文件中启用 debugtrue属性来让控制台打印自动配置报告这样我们就可以很方便的知道哪些自动配置类生效
自定义starter
一、简介 SpringBoot 最强大的功能就是把我们常用的场景抽取成了一个个starter场景启动器我们通过引入springboot 为我提供的这些场景启动器我们再进行少量的配置就能使用相应的功能。即使是这样springboot也不能囊括我们所有的使用场景往往我们需要自定义starter来简化我们对springboot的使用。
模式
我们参照 spring-boot-starter 我们发现其中没有代码
我们在看它的pom中的依赖中有个 springboot-starter
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter/artifactId
/dependency我们再看看 spring-boot-starter 有个 spring-boot-autoconfigure
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-autoconfigure/artifactId
/dependency启动器starter是一个空的jar文件仅仅提供辅助性依赖管理这些依赖可能用于自动装配或其他类库。需要专门写一个类似spring-boot-autoconfigure的配置模块用的时候只需要引入启动器starter就可以使用自动配置了
命名规范
官方命名空间
前缀spring-boot-starter-模式spring-boot-starter-模块名举例spring-boot-starter-web、spring-boot-starter-jdbc
自定义命名空间
后缀-spring-boot-starter模式模块-spring-boot-starter举例mybatis-spring-boot-starter
参数校验
引入依赖 dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-validation/artifactId/dependency!--hibernate validator依赖--dependencygroupIdorg.hibernate.validator/groupIdartifactIdhibernate-validator/artifactIdversion6.0.1.Final/version/dependency添加配置
Bean
public Validator validator(){ValidatorFactory validatorFactory Validation.byProvider(HibernateValidator.class).configure().failFast(true).buildValidatorFactory();return validatorFactory.getValidator();
}使用
Length(max 64, message “职务名称超长”) 不校验null的字段 Email 不去检验null和空字符串 Pattern 可以允许当前字段为null针对非null做校验 AssertTrue 不去检验null值
1Controller上的参数校验主要针对于RequestBody的POJO 2Bean的方法参数校验 3针对bean的属性做参数校验
Valid和Validated区别
区别ValidValidated提供者JSR-303 规范Spring,意味着只能用于POJO之外的地方比如controller类上、方法、参数上是否支持分组不支持支持标注位置METHOD, FIELD, CONSTRUCTOR, PARAMETER, TYPE_USETYPE, METHOD, PARAMETER嵌套校验支持不支持
异常处理
需要全局处理MethodArgumentNotValidException、ConstraintViolationException、BindException异常
ExceptionHandler(value MethodArgumentNotValidException.class)
ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public Response? exceptionHandler(HttpServletRequest httpServletRequest, MethodArgumentNotValidException e) {log.error(字段校验错误!, e);String msg Optional.ofNullable(e.getBindingResult().getFieldError()).map(DefaultMessageSourceResolvable::getDefaultMessage).orElse(NETWORK_ERROR_MSG);return new Response(CommonErrorCode.FIELD_VALIDATE_FAIL.getCode(), msg);
}ExceptionHandler(value ConstraintViolationException.class)
ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public Response? exceptionHandler(HttpServletRequest httpServletRequest, ConstraintViolationException e) {log.error(字段校验错误!, e);ConstraintViolation? constraintViolation null;IteratorConstraintViolation? iterator e.getConstraintViolations().iterator();if (iterator.hasNext()) {constraintViolation iterator.next();}String msg Optional.ofNullable(constraintViolation).map(ConstraintViolation::getMessage).orElse(NETWORK_ERROR_MSG);return new Response(CommonErrorCode.FIELD_VALIDATE_FAIL.getCode(), msg);
}ExceptionHandler(value BindException.class)
ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public Response? exceptionHandler(HttpServletRequest httpServletRequest, BindException e) {log.error(字段校验错误!, e);String msg Optional.ofNullable(e.getBindingResult().getFieldError()).map(DefaultMessageSourceResolvable::getDefaultMessage).orElse(NETWORK_ERROR_MSG);return new Response(CommonErrorCode.FIELD_VALIDATE_FAIL.getCode(), msg);
}