Spring Boot @Validated 和Javax的@Valid配合使用
一、@Validated 和@Valid有什么用
@Validation 和@Valid 常常配合使用对传输的参数进行数据校验的注解,并通过配置全局异常处理器进行合理化的提示,增加用户的体验
并且@Validated可以通过分组来指定什么时候触发什么样的参数校验(这里看一下就行,下面有说什么是分组)
二、为什么要使用@Validated 和@Valid的思考?
其实不用这两个注解也可以完成对传输的参数进校验,那样我们就需要一直写if语句进行判断 ,如果不为xxx,抛出异常,然后进行捕获处理
但是当多处都用到的一样的传输参数的时候,我们每次都需要写一些重复的if进行校验,其实代码是不优雅的。因此有了这两个组件来帮我们进行传输参数的校验。
三、使用方法
3.1 引入pom
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--validator请求参数校验--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><!--测试方法--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId></dependency></dependencies>
3.2 写实体类加入一写校验注解
常用的校验注解
package com.sofwin.validator.domain;import com.sofwin.validator.config.InsertGroup;
import com.sofwin.validator.config.Status;
import com.sofwin.validator.config.UpdateGroup;
import lombok.Data;
import org.hibernate.validator.constraints.Range;
import org.springframework.web.bind.annotation.Mapping;import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.math.BigDecimal;
import java.util.List;/*** @packageName: com.sofwin.validator.domain* @author: wentao* @date: 2023/9/4 21:17* @version: 1.0* @email 1660420659@qq.com* @description: 测试*/
@Data
public class UserR {@NotBlank(message = "名称不能为空")private String name;@NotNull(message = "年龄不能为空")@Range(min = 1,max = 200,message ="最小为{min}岁,最大为{max}岁" )private Integer age;@Size(message ="编号长度为 [4-8] ", min = 4, max = 8)private String idNo;}
3.3 编写controller层进行测试 (请求参数是对象)
注意需要在请求参数的前面加上@Valid注解
统一返回类
package com.sofwin.validator.config;import lombok.Data;/*** @packageName: com.sofwin.validator.config* @author: wentao* @date: 2023/9/4 21:34* @version: 1.0* @email 1660420659@qq.com* @description: 统一返回参数*/
@Data
public class BaseResult<T> {private int code;private String message;private T data;public BaseResult() {}public BaseResult(int code, T data,String message) {this.code = code;this.message = message;this.data = data;}public static <T> BaseResult<T> build(int code, T data, String message) {return new BaseResult<T>(code,data,message);}public static <T> BaseResult<T> build( T data, BaseResult resultCodeEnum) {return new BaseResult<T>(resultCodeEnum.getCode(),data,resultCodeEnum.getMessage());}public static <T> BaseResult<T> ok(T data) {return new BaseResult<>(20000,data,"success");}public static <T> BaseResult<T> fail(T data) {return new BaseResult<>(50000,data,"error");}}
controller
package com.sofwin.validator.controller;import com.sofwin.validator.config.BaseResult;
import com.sofwin.validator.config.InsertGroup;
import com.sofwin.validator.domain.UserR;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;import javax.validation.Valid;
import javax.validation.constraints.NotNull;/*** @packageName: com.sofwin.validator.controller* @author: wentao* @date: 2023/9/4 21:14* @version: 1.0* @description: 请求参数校验*/@RestController
@RequestMapping("validator")
public class ValidatorController {@PostMapping("/validPost")public BaseResult validPostTest(@Valid @RequestBody UserR user ) {return BaseResult.ok(user);}}
正常参数
非正常参数
我们发现没有提示我们在实体中message中写的提示信息,是因为我们没有设置全局异常处理器
,它只是在控制台返回了提示信息
2023-09-05 21:24:03.305 WARN 20924 --- [nio-8080-exec-1] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.bind.MethodArgumentNotValidException: Validation failed for argument [0] in public com.sofwin.validator.config.BaseResult com.sofwin.validator.controller.ValidatorController.validPostTest(com.sofwin.validator.domain.UserR): [Field error in object 'userR' on field 'age': rejected value [1111]; codes [Range.userR.age,Range.age,Range.java.lang.Integer,Range]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [userR.age,age]; arguments []; default message [age],200,1]; default message [最小为1岁,最大为200岁]] ]
全局异常处理器
package com.sofwin.validator.config;import lombok.extern.slf4j.Slf4j;
import org.slf4j.LoggerFactory;
import org.springframework.validation.BindException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException;
import java.util.Set;
import org.slf4j.Logger;/*** @packageName: com.sofwin.validator.config* @author: wentao* @date: 2023/9/4 21:28* @version: 1.0* @email 1660420659@qq.com* @description: 全局异常处理器*/@RestControllerAdvice
@Slf4j
public class GlobExceptionHandeler {private final Logger logger = LoggerFactory.getLogger(getClass());//valid参数校验出现异常@ExceptionHandler(BindException.class)public BaseResult bindException(BindException e) {logger.error("valid参数校验出现异常");System.out.println(e);return BaseResult.build(441,null,e.getBindingResult().getAllErrors().get(0).getDefaultMessage());}//validated参数校验出现异常@ExceptionHandler(ConstraintViolationException.class)public BaseResult constraintViolationException(ConstraintViolationException e) {logger.error("validated参数校验出现异常");return BaseResult.build(441,null,e.getLocalizedMessage().split(":")[1].trim());}@ExceptionHandler(Exception.class)public BaseResult constraintViolationException(Exception e) {logger.error("Exception");return BaseResult.build(441,null,e.getLocalizedMessage());}
}
加入全局异常处理器后非正常参数返回结果:
3.4 当参数不是一个对象
一定要在controller上加入@Validated才生效
@RestController
@RequestMapping("validator")
@Validated
public class ValidatorController {@PostMapping("/validPost")public BaseResult validPostTest(@Valid @RequestBody UserR user ) {return BaseResult.ok(user);}@GetMapping("/validGet1")public BaseResult validGetTest( @NotBlank(message = "名字不能为空") String name ) {return BaseResult.ok(name);}
}
3.5 分组
当我们在特定情况下才进行参数校验才进行分组,例如只有当我们插入的时候我们进行校验,其他时候不进行参数的校验,这个时候就可以使用分组
实体类
package com.sofwin.validator.domain;import com.sofwin.validator.config.InsertGroup;
import com.sofwin.validator.config.Status;
import com.sofwin.validator.config.UpdateGroup;
import lombok.Data;
import org.hibernate.validator.constraints.Range;
import org.springframework.web.bind.annotation.Mapping;import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.math.BigDecimal;
import java.util.List;/*** @packageName: com.sofwin.validator.domain* @author: wentao* @date: 2023/9/4 21:17* @version: 1.0* @email 1660420659@qq.com* @description: 测试*/
@Data
public class UserR {@NotBlank(message = "名称不能为空")//进行分组@NotBlank(message = "名称不能为空(InsertGroup)",groups = InsertGroup.class)private String name;@NotNull(message = "年龄不能为空")@NotNull(message = "年龄不能为空(InsertGroup)",groups = {InsertGroup.class,UpdateGroup.class})@Range(min = 1,max = 200,message ="最小为{min}岁,最大为{max}岁" )private Integer age;@Size(message ="编号长度为 [4-8] ", min = 4, max = 8)private String idNo;}
其中InsertGroup和UpdateGroup只是一个普通的接口
public interface InsertGroup {}public interface UpdateGroup {}
controller
package com.sofwin.validator.controller;import com.sofwin.validator.config.BaseResult;
import com.sofwin.validator.config.InsertGroup;
import com.sofwin.validator.domain.UserR;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;/*** @packageName: com.sofwin.validator.controller* @author: wentao* @date: 2023/9/4 21:14* @version: 1.0* @description: 请求参数校验*/@RestController
@RequestMapping("validator")
@Validated
public class ValidatorController {@PostMapping("/validPost")public BaseResult validPostTest(@Valid @RequestBody UserR user ) {return BaseResult.ok(user);}@PostMapping("/validPost2")public BaseResult validPostTest2(@Validated(InsertGroup.class) @RequestBody UserR user ) {return BaseResult.ok(user);}@GetMapping("/validGet1")public BaseResult validGetTest( @NotBlank(message = "名字不能为空") String name ) {return BaseResult.ok(name);}@GetMapping("/validGet2")public BaseResult validGetTest2(@Validated(InsertGroup.class) @NotNull(message = "名字不能为空") String name ) {return BaseResult.ok(name);}
}
测试
validPost2、validGet2
validPost2
validGet2
3.6 自定义注解
当它提供的注解我们没有办法解决我们的问题的时候,我们就可以自定义注解
定义注解Status
package com.sofwin.validator.config;import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;/*** @packageName: com.sofwin.validator.config* @author: wentao* @date: 2023/9/4 21:52* @version: 1.0* @email 1660420659@qq.com* @description: 自定义校验注解*/
@Target({ElementType.FIELD,ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
//自己写校验规则
@Constraint(validatedBy = {StatusConstraint.class})
//元注解 可以分组使用,如果不写定义相同的注解会出现错误
@Repeatable(Status.List.class)
public @interface Status {String[] statusType() default {};String message() default "状态传递有误";Class<?>[] groups() default {};Class<? extends Payload>[] payload() default {};@Target({ElementType.FIELD,ElementType.PARAMETER})@Retention(RetentionPolicy.RUNTIME)@Documented@interface List {Status[] value();}}
校验规则
package com.sofwin.validator.config;import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.lang.annotation.Annotation;
import java.util.Arrays;
import java.util.List;/*** @packageName: com.sofwin.validator.config* @author: wentao* @date: 2023/9/4 22:04* @version: 1.0* @email 1660420659@qq.com* @description: 自定义校验柜子*/
public class StatusConstraint implements ConstraintValidator<Status,Integer> {List<String> statusType;/*** 一般进行初始化* @param constraintAnnotation*/@Overridepublic void initialize(Status constraintAnnotation) {String[] strings = constraintAnnotation.statusType();statusType = Arrays.asList(strings);}/**** @param value 参数的值* @param context* @return true 通过不抛出异常 fasle不通过抛出异常*/@Overridepublic boolean isValid(Integer value, ConstraintValidatorContext context) {if (value !=null) {if (!statusType.contains(String.valueOf(value))) {return false;}return true;}return false;}
}
测试
实体类
package com.sofwin.validator.domain;import com.sofwin.validator.config.InsertGroup;
import com.sofwin.validator.config.Status;
import com.sofwin.validator.config.UpdateGroup;
import lombok.Data;
import org.hibernate.validator.constraints.Range;
import org.springframework.web.bind.annotation.Mapping;import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.math.BigDecimal;
import java.util.List;/*** @packageName: com.sofwin.validator.domain* @author: wentao* @date: 2023/9/4 21:17* @version: 1.0* @email 1660420659@qq.com* @description: 测试*/
@Data
public class UserR {@NotBlank(message = "名称不能为空")//进行分组@NotBlank(message = "名称不能为空(InsertGroup)",groups = InsertGroup.class)private String name;@NotNull(message = "年龄不能为空")@NotNull(message = "年龄不能为空(InsertGroup)",groups = {InsertGroup.class,UpdateGroup.class})@Range(min = 1,max = 200,message ="最小为{min}岁,最大为{max}岁" )private Integer age;@Status(statusType = {"1","2"})private Integer status;@Size(message ="编号长度为 [4-8] ", min = 4, max = 8)private String idNo;}
controller
@PostMapping("/validPost")public BaseResult validPostTest(@Valid @RequestBody UserR user ) {return BaseResult.ok(user);}
正常传参
非正常传参
3.7 当出现类中出现嵌套的情况
当出现嵌套的情况只需要在类的属性中在加一个注解@Valid
实体类
package com.sofwin.validator.domain;import com.sofwin.validator.config.InsertGroup;
import com.sofwin.validator.config.Status;
import com.sofwin.validator.config.UpdateGroup;
import lombok.Data;
import org.hibernate.validator.constraints.Range;
import org.springframework.web.bind.annotation.Mapping;import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.math.BigDecimal;
import java.util.List;/*** @packageName: com.sofwin.validator.domain* @author: wentao* @date: 2023/9/4 21:17* @version: 1.0* @email 1660420659@qq.com* @description: 测试*/
@Data
public class UserR {@NotBlank(message = "名称不能为空")//进行分组@NotBlank(message = "名称不能为空(InsertGroup)",groups = InsertGroup.class)private String name;@NotNull(message = "年龄不能为空")@NotNull(message = "年龄不能为空(InsertGroup)",groups = {InsertGroup.class,UpdateGroup.class})@Range(min = 1,max = 200,message ="最小为{min}岁,最大为{max}岁" )private Integer age;@Status(statusType = {"1","2"})private Integer status;@Size(message ="编号长度为 [4-8] ", min = 4, max = 8)private String idNo;//嵌套使用valid才能生效@Validprivate List<SonUser> sonUserList;
}
package com.sofwin.validator.domain;import com.sofwin.validator.config.InsertGroup;
import com.sofwin.validator.config.UpdateGroup;
import lombok.Data;import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.math.BigDecimal;/*** @packageName: com.sofwin.validator.domain* @author: wentao* @date: 2023/9/4 21:17* @version: 1.0* @email 1660420659@qq.com* @description: 测试*/
@Data
public class SonUser {@NotBlank(message = "sonName不能为空")private String sonName;}
controller
@PostMapping("/validPost")public BaseResult validPostTest(@Valid @RequestBody UserR user ) {return BaseResult.ok(user);}
四、 总结
@Valid:没有分组的功能。
@Valid:可以用在方法、构造函数、方法参数和成员属性(字段)上
@Validated:提供了一个分组功能,可以在入参验证时,根据不同的分组采用不同的验证机制
@Validated:可以用在类型、方法和方法参数上。但是不能用在成员属性(字段)上
两者是否能用于成员属性(字段)上直接影响能否提供嵌套验证的功能
相关文章:

Spring Boot @Validated 和Javax的@Valid配合使用
一、Validated 和Valid有什么用 Validation 和Valid 常常配合使用对传输的参数进行数据校验的注解,并通过配置全局异常处理器进行合理化的提示,增加用户的体验 并且Validated可以通过分组来指定什么时候触发什么样的参数校验(这里看一下就行…...

论文复现--lightweight-human-pose-estimation-3d-demo.pytorch(单视角多人3D实时动作捕捉DEMO)
分类:动作捕捉 github地址:https://github.com/Daniil-Osokin/lightweight-human-pose-estimation-3d-demo.pytorch 所需环境: Windows10,conda 4.13.0; 目录 conda环境配置安装Pytorch全家桶安装TensorRT(…...
在Windows下设置将EXE开机自启动
在Windows下设置将EXE开机自启动,有多种方法。以下是两种常用的方法: 方法一:通过注册表 打开“运行”(快捷键:Win R),输入:reg add HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windo…...

反序列化漏洞及漏洞复现
文章目录 渗透测试漏洞原理不安全的反序列化1. 序列化与反序列化1.1 引例1.2 序列化实例1.2.1 定义一个类1.2.2 创建对象1.2.3 反序列化1.2.4 对象注入 2. 漏洞何在2.1 漏洞触发 3. 反序列化漏洞攻防3.1 PHP反序列化实例3.1.1 漏洞利用脚本3.1.2 漏洞利用3.1.3 获取GetShell 3.…...
软件工程笔记001
2023年9月5日,周二上午 软件工程的目标 软件工程的目标是成功地开发一个软件: 较低的开发成本能按时交付软件开发出来的软件该有的功能都有开发出来的软件运行效率高开发出来的软件可靠性高开发出来的软件易于维护 软件的生存周期 概念 软件生存周期…...
java进行系统的限流实现--Guava RateLimiter、简单计数、滑窗计数、信号量、令牌桶
本文主要介绍了几种限流方法:Guava RateLimiter、简单计数、滑窗计数、信号量、令牌桶,漏桶算法和nginx限流等等 1、引入guava集成的工具 pom.xml 文件 <dependency><groupId>com.google.guava</groupId><artifactId>guava<…...

《86盒应用于家居中控》——实现智能家居的灵动掌控
近年来,智能家居产品受到越来越多消费者的关注,其便捷、舒适的生活方式让人们对未来生活充满期待。作为智能家居方案领域的方案商,启明智显生产设计的86盒凭借出色的性能和良好的用户体验,成功应用于家居中控系统,让家…...

【LeetCode】328. 奇偶链表
328. 奇偶链表(中等) 思路 如果链表为空,则直接返回链表。 对于原始链表,每个节点都是奇数节点或偶数节点。头节点是奇数节点,头节点的后一个节点是偶数节点,相邻节点的奇偶性不同。因此可以将奇数节点和偶…...

数字城市:科技革命下的未来之城
随着科技的不断进步,数字城市已经成为了未来城市发展的关键趋势。数字城市是指利用先进的信息技术、互联网和大数据等工具,将城市各个方面进行数字化、智能化、互联化的发展模式。它不仅仅是一种技术,更是一种对城市管理、发展和居民生活方式…...

Qt鼠标点击事件处理:按Escape键退出程序
创建项目 Qt 入门实战教程(目录) 首先,创建一个名称为QtKeyEscape的Qt默认的窗口程序。 参考 :Qt Creator 创建 Qt 默认窗口程序 Qt响应键盘Escape事件 打开Qt Creator >>编辑 >> 项目 >> Headers>> …...
P1162 填涂颜色
填涂颜色 - 洛谷 这个题用逆向思维,见不用染色的地方标记。 这里为了处理一些情况,将图周围一圈的0空出来,用于吧围墙之外的部分都标记上 用宽搜,四联通,感觉好奇怪,八连通ac不了 #include <iostrea…...

Vagrant命令
文章目录 1.介绍2.下载3. 配置3.1 配置环境变量3.2 在xshell中连接使用 4. 相关命令4.1 Box相关4.2 初始化环境4.4 虚拟机相关 1.介绍 Vagrant 是一个虚拟机管理工具 2.下载 https://www.vagrantup.com/ 3. 配置 3.1 配置环境变量 测试安装是否成功 3.2 在xshell中连接使…...
vue3+pinia实现动态类名及动态颜色
前提 store下models下有个before.ts文件 import { defineStore } from "pinia"; export const usebeforeloggininStore defineStore("counterStore", {state: () > ({beforelogin_params: [{type: "A登录",color: "#000",flag: 1,…...
CSS实现隐藏滚动条但可以滚动
场景 隐藏滚动条,但可以滚动 解决 全局样式 /* 隐藏滚动条 */ .outer-container::-webkit-scrollbar {width: 0; /* 设置滚动条的宽度为0 */background-color: transparent; /* 设置滚动条背景为透明 */ }/* 自定义滚动条轨道样式 */ .outer-container::-webkit…...
Ceph入门到精通-lunix将文本5行合成1行并按列统计
要将每5行合并为1行,您可以使用shell命令来完成。假设您有一个名为text.txt的文本文件,您可以使用以下命令来实现: bash cat text.txt | paste -d - - - - - 这将把文件中的每5行合并为1行,并且每个字段之间用空格分隔开来。您…...

linux线程讲解
1.线程概述 一个进程在同一时刻只做一件事情,进程是程序执行的一个实例。 线程是操作系统能够进行运算调度的最小单位,一个进程中可以并发多个线程,每条线程并行执行不同的任务。 进程:资源分配的最小单位。线程,程…...

解决本地jar包导入maven
1、确定是否安装maven 2、输入导入命令 命令说明 <path-to-file>为你jar包所在的路径(尽量简单并且不要含中文) <group-id>为grouId号,与<artifact-id>组成唯一识别你jar包的坐标,当不在公共资源jar包中&#…...
ArcGis地图
1、概述 官网:https://developers.arcgis.com/qt/ 官网:官网指导 官网:Add graphics to a map view Arcgis runtime sdk for Qt 开发记录(系列文章) 2、创建地图 //online: m_mapView new MapGraphicsV…...

Chrome 和 Edge 上出现“status_breakpoint”错误解决办法
文章目录 STATUS_BREAKPOINTSTATUS_BREAKPOINT报错解决办法Chrome浏览器 Status_breakpoint 错误修复- 将 Chrome 浏览器更新到最新版本- 卸载不再使用的扩展程序和应用程序- 安装计算机上可用的任何更新,尤其是 Windows 10- 重启你的电脑。 Edge浏览器 Status_brea…...
华为AP升级操作记录
AP型号:AP4050DN 原版本:AP4050DN CLOUD V200R008C10SPC700 升级后版本:AP4000 V200R019C00SPC913 开启FTP,用户名:admin, 密码:123456 FTP服务端地址:192.168.8.58 操作:将AP连接…...

使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
React Native 导航系统实战(React Navigation)
导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...

Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

el-switch文字内置
el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具
第2章 虚拟机性能监控,故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令:jps [options] [hostid] 功能:本地虚拟机进程显示进程ID(与ps相同),可同时显示主类&#x…...
ip子接口配置及删除
配置永久生效的子接口,2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用
文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么?1.1.2 感知机的工作原理 1.2 感知机的简单应用:基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...

【C++进阶篇】智能指针
C内存管理终极指南:智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...