当前位置: 首页 > news >正文

Spring Boot组件化与参数校验

Spring Boot组件化与参数校验

Spring Boot版本选择

  1. 2.3.x版本

  2. 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底层会自动扫描当前配置类所有在的包。TypeExcludeFilter:springboot对外提供的扩展类, 可以供我们去按照我们的方式进行排除,去找到所有自定义的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实现了DeferredImportSelector,Spring延迟到项目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中获得候选的自动配置类List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes);// 排重configurations = removeDuplicates(configurations);//根据EnableAutoConfiguration注解中属性,获取不需要自动装配的类名单// 根据:@EnableAutoConfiguration.exclude// @EnableAutoConfiguration.excludeName// spring.autoconfigure.exclude  进行排除Set<String> 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容器中存在指定Bean;
@ConditionalOnMissingBean容器中不存在指定Bean;
@ConditionalOnExpression满足SpEL表达式指定
@ConditionalOnClass系统中有指定的类
@ConditionalOnMissingClass系统中没有指定的类
@ConditionalOnSingleCandidate容器中只有一个指定的Bean,或者这个Bean是首选Bean
@ConditionalOnProperty系统中指定的属性是否有指定的值
@ConditionalOnResource类路径下是否存在指定资源文件
@ConditionalOnWebApplication当前是web环境
@ConditionalOnNotWebApplication当前不是web环境
@ConditionalOnJndiJNDI存在指定项

我们可以通过设置配置文件中:启用 debug=true属性;来让控制台打印自动配置报告,这样我们就可以很方便的知道哪些自动配置类生效;
在这里插入图片描述

自定义starter

一、简介 SpringBoot 最强大的功能就是把我们常用的场景抽取成了一个个starter(场景启动器),我们通过引入springboot 为我提供的这些场景启动器,我们再进行少量的配置就能使用相应的功能。即使是这样,springboot也不能囊括我们所有的使用场景,往往我们需要自定义starter,来简化我们对springboot的使用。

模式

我们参照 spring-boot-starter 我们发现其中没有代码:
在这里插入图片描述

我们在看它的pom中的依赖中有个 springboot-starter

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId>
</dependency>

我们再看看 spring-boot-starter 有个 spring-boot-autoconfigure

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-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

参数校验

  1. 引入依赖
    <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId></dependency><!--hibernate validator依赖--><dependency><groupId>org.hibernate.validator</groupId><artifactId>hibernate-validator</artifactId><version>6.0.1.Final</version></dependency>
  1. 添加配置
@Bean
public Validator validator(){ValidatorFactory validatorFactory = Validation.byProvider(HibernateValidator.class).configure().failFast(true).buildValidatorFactory();return validatorFactory.getValidator();
}
  1. 使用

@Length(max = 64, message = “职务名称超长”) 不校验null的字段
@Email 不去检验null和空字符串
@Pattern 可以允许当前字段为null,针对非null做校验
@AssertTrue 不去检验null值

(1)Controller上的参数校验,主要针对于@RequestBody的POJO
(2)Bean的方法参数校验
(3)针对bean的属性做参数校验

@Valid和@Validated区别

区别@Valid@Validated
提供者JSR-303 规范Spring,意味着只能用于POJO之外的地方,比如controller类上、方法、参数上
是否支持分组不支持支持
标注位置METHOD, FIELD, CONSTRUCTOR, PARAMETER, TYPE_USETYPE, METHOD, PARAMETER
嵌套校验支持不支持
  1. 异常处理

需要全局处理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;Iterator<ConstraintViolation<?>> 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);
}

相关文章:

Spring Boot组件化与参数校验

Spring Boot组件化与参数校验 Spring Boot版本选择 2.3.x版本 2.6.x版本 Spring Boot核心思想 约定大于配置&#xff0c;简化繁琐的配置 Spring Boot自动配置原理 SpringBootApplication: Spring Boot应用标注在某个类上说明这个类是SpringBoot的主配置类&#xff0c;Spr…...

实现可扩展的电商返利平台:技术选型与挑战

实现可扩展的电商返利平台&#xff1a;技术选型与挑战 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 在当今数字化和电商兴盛的时代&#xff0c;返利平台成为…...

从0开始C++(三):构造函数与析构函数详解

目录 构造函数 构造函数的基本使用 构造函数也支持函数重载 构造函数也支持函数参数默认值 构造初始化列表 拷贝构造函数 浅拷贝和深拷贝 析构函数 总结 练习一下ヽ(&#xffe3;▽&#xffe3;)&#xff89; 构造函数 构造函数的基本使用 构造函数是一种特殊的成…...

行车记录仪文件夹“0字节”现象解析与恢复策略

一、行车记录仪文件夹“0字节”现象描述 行车记录仪作为现代驾驶中的必备设备&#xff0c;其储存的视频数据对于事故记录和取证至关重要。然而&#xff0c;有时车主们可能会遇到这样一个问题&#xff1a;行车记录仪的某个文件夹内的文件突然变成了0字节大小&#xff0c;无法正…...

呼叫中心系统的功能都有哪些?okcc呼叫中心pscc磐石云呼叫系统部署

当前电话营销普及到各行各业&#xff0c;方便快捷成了大部分企业在宣传自己公司的产品时必用的一种营销方式&#xff0c;但是电话营销在管理上也存在许多问题。例如&#xff1a;销售员与客户沟通前&#xff0c;未能详细了解客户的资料&#xff1b;多名销售员重复拨打同一个客户…...

2024.06.08校招 实习 内推 面经

绿*泡*泡VX&#xff1a; neituijunsir 交流*裙 &#xff0c;内推/实习/校招汇总表格 1、提前批 | 中电锦江2025届提前批招聘 提前批 | 中电锦江2025届提前批招聘 2、实习 | 国电电力2025届暑期实习生计划启动&#xff01; 实习 | 国电电力2025届暑期实习生计划启动&#x…...

Polyplus——转染试剂专业供应商

PolyPlus-transfection是一家专业的转染试剂研发和生产的生物技术公司&#xff0c;拥有20年的的转染试剂研发经验&#xff0c;通过创新的核酸转染解决方案支持基因和细胞治疗、生物制剂制造和生命科学研究。目前已经通过了ISO 9001: 2000质量体系认证&#xff0c;已经开发了一系…...

微服务架构-线上治理、线下治理与架构演进

目录 一、线上治理 1.1 概述 1.2 线上预案体系 1.2.1 概述 1.2.2 变更引起的故障 1.2.3 流量和容量变化引起的故障 1.2.4 依赖故障 1.2.5 机房、网络等硬件和环境故障 1.2.6 其他 1.2.7 故障的场景化 1.3 基于Metric的预案自动触发 1.4 治理参数动态调整 1.4.1 举例…...

网络安全:什么是SQL注入

文章目录 网络安全&#xff1a;什么是SQL注入引言SQL注入简介工作原理示例代码 攻击类型为什么SQL注入危险结语 网络安全&#xff1a;什么是SQL注入 引言 在数字化时代&#xff0c;数据安全成为了企业和个人最关心的问题之一。SQL注入&#xff08;SQL Injection&#xff09;是…...

从零开始精通Onvif之网络配置

&#x1f4a1; 如果想阅读最新的文章&#xff0c;或者有技术问题需要交流和沟通&#xff0c;可搜索并关注微信公众号“希望睿智”。 概述 网络配置是Onvif规范中的重要组成部分&#xff0c;允许用户通过网络远程配置和管理设备的网络设置&#xff0c;比如&#xff1a;DHCP、IP地…...

在 macOS 上使用 Homebrew 安装和配置 Python 及 Tk 库

在 macOS 上&#xff0c;系统自带的 /usr/bin/python3 版本较旧&#xff0c;且直接升级系统自带的 Python 版本可能会影响系统稳定性。因此&#xff0c;推荐使用 Homebrew 来安装和管理 Python 及其相关库。本文将详细介绍如何通过 Homebrew 安装和配置 Python 3 及 Tk 库&…...

【机器学习 复习】第2章 线性回归及最大熵模型

一、概念 1.回归就是用一条曲线对数据点进行拟合&#xff0c;该曲线称为最佳拟合曲线&#xff0c;这个拟合过程称为回归。 2.一个自变量 叫 一元线性回归&#xff0c;大于一个自变量 叫 多元线性回归。 &#xff08;1&#xff09;多元回归&#xff1a;两个x&#xff0c;一个…...

关于椭圆的方程(有Python画的动图)

关于椭圆的方程&#xff08;有Python画的动图&#xff09; flyfish 几何定义 椭圆是平面上所有到两个固定点&#xff08;焦点&#xff09;的距离之和为常数的点的集合。这两个固定点叫做焦点。 解析几何描述 设椭圆的两个焦点为 F 1 F_1 F1​ 和 F 2 F_2 F2​&#xff…...

selenium常见难点解决方案

勾选框勾选问题 勾选框代码逻辑实现过程&#xff1a; 第一步&#xff1a;首先找到勾选框的元素&#xff1b; 第二步&#xff1a;检查它是否已经被勾选。如果已经勾选&#xff0c;则进行取消勾选操作&#xff1b;如果未勾选&#xff0c;则进行点击勾选操作&#xff1b; 以下是一…...

【Python高级编程】 综合练习-使用OpenCV 进行视频数据处理

综合练习 读取一个视频文件&#xff0c;对其进行处理后保存为一个新的视频文件。具体的处理步骤包括调整帧大小、转换为灰度图像、垂直翻转画面以及添加高斯噪声。 下面是代码的详细实现&#xff1a; import cv2 import numpy as np# 定义一个函数&#xff0c;用来给图像添加…...

rs232和can的区别

在电机通讯和升级固件时我们经常用到RS232和CAN两种通讯模式&#xff0c;那这两种有何不同吗&#xff1f; RS232和CAN的主要区别在于通信方式、应用场景、传输距离、通信速度以及网络结构。 通信方式&#xff1a; RS232是一种串行通信接口标准&#xff0c;支持全双工通信&…...

嵌入式软件stm32面试

一、STM32的内核型号有哪些&#xff1f; STM32系列是STMicroelectronics&#xff08;意法半导体&#xff09;生产的基于ARM Cortex-M内核的微控制器产品线。这些产品按照不同的内核架构和性能特点分为了主流产品、超低功耗产品和高性能产品。 1.1 主流产品 STM32F0 系列&…...

【Git】-- 添加公钥到 github 或者gitlab上

仅针对系统&#xff1a;mac os 、 unix、linux 1、检查是否有 id_rsa.pub $ cd ~ $ ls -al ~/.ssh 注意&#xff1a;若已有 id_rsa.pub&#xff0c;则必要执行 第二步&#xff0c;避免覆盖掉原有正常的公钥。 配置多个 git 账号请参考&#xff1a;同一台电脑配置多个git账…...

Vue页面生成PDF后调起浏览器打印

一、安装依赖 首先&#xff0c;需要安装 html2canvas 和 jsPDF 库。 npm install html2canvas jspdf二、创建公共方法引入 在utils文件夹下创建两个文件分别为pdfExport.js和printPDF.js&#xff0c;代码如下&#xff1a; pdfExport.js import html2canvas from html2canv…...

纯前端实现导出excel

项目背景&#xff1a; vue2 插件&#xff1a; xlsx&#xff1b;xlsx-style&#xff1b;file-saver 说明&#xff1a; 单独使用 xlsx插件&#xff0c;也可以将网页上的table导出成excel&#xff0c;但是导出的excel&#xff0c;没有样式 结合xlsx-style&#xff1b;file-saver&a…...

QT windows 5.12.0 安装包

这个是在线包&#xff0c;需要有账号的。 没有也没事&#xff0c;安装界面可以现场注册 百度网盘链接&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1QvXDert4b94GbUfD2f2G4g?pwd8888 提取码&#xff1a;8888...

改进YOLOv7 | 在 ELAN 模块中添加【Triplet】【SpatialGroupEnhance】【NAM】【S2】注意力机制 | 附详细结构图

改进 YOLOv7 | 在 ELAN 模块中添加【Triplet】【SpatialGroupEnhance】【NAM】【S2】注意力机制&#xff1a;中文详解 1. 简介 YOLOv7 是目前主流的目标检测算法之一&#xff0c;具有速度快、精度高的特点。但 YOLOv7 的原始模型结构中缺乏注意力机制&#xff0c;导致模型对全…...

windows系统停止更新办法

windows系统停止更新 双击启动下载的文件 然后再回到系统-更新这里&#xff0c;选择日期就行。...

数据标注概念

数据标注的步骤 数据清洗&#xff1a;处理数据中的噪声、缺失值和异常值&#xff0c;确保数据的质量和完整性。 数据转换&#xff1a;将数据从原始格式转换为适合机器学习模型处理的格式。 数据标注&#xff1a;根据应用需求&#xff0c;为数据添加标签或注释&#xff0c;标识…...

网络安全复习笔记

概述 要素 CIA&#xff1a;可用性&#xff1b;完整性&#xff1b;保密性。 可控性&#xff1b;不可否认性&#xff1b;可审查性。 攻击 被动&#xff1a;窃听 - 保密性&#xff1b;监听 - 保密性主动&#xff1a;假冒 - 完整性&#xff1b;重放 - 完整性&#xff1b;改写 -…...

Laravel - excel 导入数据

在Laravel中&#xff0c;可以使用maatwebsite/excel这个库来处理Excel文件的导入。 1.用命令行窗口打开项目根目录&#xff0c;使用 Composer 安装 maatwebsite/excel composer require maatwebsite/excel --ignore-platform-reqs 在你的config/app.php文件中注册服务提供者&…...

移动语义和完美转发

C11 引入了许多新特性&#xff0c;使得编写高效且现代的 C 代码变得更加容易。其中&#xff0c;移动语义&#xff08;Move Semantics&#xff09;和完美转发&#xff08;Perfect Forwarding&#xff09;是两个重要的特性&#xff0c;极大地提升了 C 的性能和灵活性。 移动语义…...

【IDEA】Spring项目build失败

通常因为环境不匹配需要在file->projectstructure里面调整一下。...

【无标题】安卓app 流量

该工具可以用于安卓app 流量&#xff0c;内存&#xff0c;cpu&#xff0c;fps等专项内容测试&#xff0c;并且有整机内存&#xff0c;cpu对比&#xff0c;还可监控手机网速&#xff0c;app流量&#xff0c;数据导出等功能&#xff0c;重点还是免费&#xff0c;毕竟PerfDog收费了…...

国产化ETL产品必备的特性(非开源包装)

ETL负责将分布的、异构数据源中的数据如关系数据、平面数据文件等抽取到临时中间层后进行抽取、清洗&#xff08;净化&#xff09;、转换、装载、标准、集成&#xff08;汇总&#xff09;...... 最后加载到数据仓库或数据集市中&#xff0c;成为联机分析处理、数据挖掘的基础。…...

网站建设开发价格/搜索引擎优化工具

HTML表单中&#xff0c;一组单选按钮&#xff08;radio&#xff09;或是一组复选框&#xff08;checkbox&#xff09;其中的name都是一样的。 这是为了方便在处理页面获取表单传递的值。 一组单选按钮&#xff08;radio&#xff09;&#xff1a;因为name属性相同&#xff0c;所…...

创业做网站/深圳网络营销和推广方案

假设一种InfoA的类型。 list<InfoA> listAnew list<InfoA>(); 泛型数组的Find&#xff08;&#xff09;方法和FindAll&#xff08;&#xff09;方法&#xff0c;参数为bool返回类型&#xff0c;传参为InfoA类型的委托 bool CheckName(InfoA info) { if(info.na…...

以下什么是网络营销的特点/seo关键词报价查询

winR 输入regedit 进入注册表找到 HKEY_CURRENT_USER\Console%SystemRoot%_system32_cmd.exe 如果 该项下已存在CodePage项&#xff0c;则把值改为十进制”65001”&#xff1b; 如该项不存在则建一个%SystemRoot%_system32_cmd.exe的项&#xff0c;然后再建一个 DWORD&#xff…...

上海装修公司排名榜前30名/企业网站seo优化

在mybaits中#{}和${}都可以用来传递参数&#xff0c;那么他们有何不同呢&#xff0c;下面来看看他们的是如何执行的&#xff0c;相信你看了之后就会明白他们的区别了。   #{}的方式&#xff1a;   XML文件配置的sql如下&#xff1a; <select id"findCommodityByKe…...

wordpress网站建设中/淘宝产品关键词排名查询

结构体是由不同数据类型的数据组成的集合体&#xff0c;声明形式如下&#xff1a;Struct 结构体名{数据类型说明符1 成员名1&#xff1b;数据类型说明符2 成员名2&#xff1b;..数据类型说明符n 成员名n&#xff1b;}&#xff1b;仅仅声明结构体类型是不够的&#xff0c;要使用…...

模具网站建设/seo刷排名公司

题目链接 要求矩形的面积并 代码不复杂&#xff0c;主要要理解扫描线的思想以及一些细节的处理。 首先需要将接收到的x坐标离散化&#xff0c;方法就是排序去重。接下来的线段树建立在这个 关于x坐标的数组上&#xff0c;这很关键。线段树的节点代表一段区间&#xff0c;这个区…...