SpringBoot2.x 参数校验问题小结

目录
  • 一、引入依赖
  • 二、实体类
  • 三、常用的校验注解
  • 四、校验Controller中的参数
  • 五、校验Service中的参数
  • 六、编程式校验
  • 七、自定义校验注解
  • 八、分组校验
  • 九、嵌套的参数校验

本文主要对SpringBoot2.x参数校验进行简单总结,其中SpringBoot使用的2.4.5版本。

一、引入依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<!-- lombok插件 -->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.8</version>
</dependency>

二、实体类

User类:

package com.rtxtitanv.model;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.validator.constraints.Length;

import javax.validation.constraints.*;

/**
 * @author rtxtitanv
 * @version 1.0.0
 * @name com.rtxtitanv.model.User
 * @description 用户实体类
 * @date 2021/8/15 16:28
 */
@AllArgsConstructor
@NoArgsConstructor
@Data
public class User {
    @NotNull(message = "id不能为空")
    private Long id;
    @Length(min = 6, max = 20, message = "用户名长度不小于6,不超过20")
    @NotNull(message = "用户名不能为空")
    private String username;
    @Pattern(regexp = "^[A-Z][A-Za-z0-9_]{5,19}$", message = "密码以大写英文字母开头,只包含英文字母、数字、下划线,长度在6到20之间")
    @NotNull(message = "密码不能为空")
    private String password;
    @Max(value = 60, message = "年龄最大为60")
    @Min(value = 18, message = "年龄最小为18")
    @NotNull(message = "年龄不能为空")
    private Integer age;
    @Email(message = "邮箱格式不正确")
    @NotEmpty(message = "邮箱不能为空")
    private String email;
    private String rank;
}

通用响应类:

package com.rtxtitanv.model;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.http.HttpStatus;

import java.io.Serializable;

/**
 * @author rtxtitanv
 * @version 1.0.0
 * @name com.rtxtitanv.model.CommonResult
 * @description 通用响应类
 * @date 2021/8/15 17:35
 */
@AllArgsConstructor
@NoArgsConstructor
@Data
public class CommonResult<T> implements Serializable {

    private static final long serialVersionUID = 5231430760082814286L;
    private int code;
    private String message;
    private T data;

    public static <T> CommonResult<T> ok(String message, T data) {
        return new CommonResult<T>(HttpStatus.OK.value(), message, data);
    }

    public static <T> CommonResult<T> fail(int code, String message, T data) {
        return new CommonResult<>(code, message, data);
    }
}

三、常用的校验注解

这里对一些用于参数校验的常用注解进行总结:

  • @Null:必须为null。
  • @NotNull:必须不为null。
  • @AssertTrue:必须为true。
  • @AssertFalse:必须为false。
  • @Min(value):必须是一个大于等于指定值的数字。
  • @Max(value):必须是一个小于等于指定值的数字。
  • @DecimalMin(value):必须是一个大于等于指定值的数字。
  • @DecimalMax(value):必须是一个小于等于指定值的数字。
  • @Size(min=,max=):大小必须在指定的范围内。
  • @Digits(integer, fraction):必须是一个数字,其值必须在可接受的范围内。
  • @Past:必须是一个过去的日期。
  • @Future:必须是一个将来的日期。
  • @Pattern(regex=):必须符合指定的正则表达式。
  • @Email:必须是一个有效的email地址。
  • @Length(min=,max=):字符串长度是否在指定范围内。
  • @NotBlank:必须非空且长度大于0。
  • @NotEmpty:必须不为null或空。
  • @URL(protocol=,host,port):必须是一个有效的URL,如果提供了protocol,host等,则还需满足提供的条件。

四、校验Controller中的参数

1.校验请求体

创建UserController,在需要校验的参数上添加@Valid注解:

package com.rtxtitanv.controller;

import com.rtxtitanv.model.CommonResult;
import com.rtxtitanv.model.User;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;

/**
 * @author rtxtitanv
 * @version 1.0.0
 * @name com.rtxtitanv.controller.UserController
 * @description UserController
 * @date 2021/8/15 16:33
 */
@RequestMapping("/user")
@RestController
public class UserController {

    @PostMapping("/save")
    public CommonResult<User> saveUser(@RequestBody @Valid User user) {
        return CommonResult.ok("保存用户成功", user);
    }
}

启动项目,发送如下POST请求,请求地址为http://localhost:8080/user/save

如果验证失败会抛出MethodArgumentNotValidException,默认情况下,Spring会将MethodArgumentNotValidException异常转换为HTTP Status 400。查看控制台打印的日志发现抛出了MethodArgumentNotValidException

创建全局异常处理类捕获异常并进行处理:

package com.rtxtitanv.handler;

import com.rtxtitanv.model.CommonResult;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Controller;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import java.util.HashMap;
import java.util.Map;

/**
 * @author rtxtitanv
 * @version 1.0.0
 * @name com.rtxtitanv.handler.GlobalExceptionHandler
 * @description 全局异常处理类
 * @date 2021/8/15 16:36
 */
@RestControllerAdvice(annotations = {Controller.class, RestController.class})
public class GlobalExceptionHandler {

    @ExceptionHandler(MethodArgumentNotValidException.class)
    @ResponseStatus(code = HttpStatus.BAD_REQUEST)
    public CommonResult<Map<String, String>> validateException(MethodArgumentNotValidException e) {
        Map<String, String> errors = new HashMap<>(16);
        e.getBindingResult().getAllErrors()
            .forEach(error -> errors.put(((FieldError)error).getField(), error.getDefaultMessage()));
        return CommonResult.fail(HttpStatus.BAD_REQUEST.value(), "无效的参数", errors);
    }
}

重启项目后再次发送如下POST请求:

2.校验请求参数

UserController上添加Validated注解并新增以下方法:

@GetMapping("/get/{id}")
public CommonResult<User>
    getUserById(@Valid @PathVariable(value = "id") @Min(value = 1, message = "id不能小于1") Long id) {
    User user = new User(id, "ZhaoYun", "A123456sd", 20, "zhaoyun123@xxx.com", "黄金");
    return CommonResult.ok("根据id查询用户成功", user);
}

@DeleteMapping("/delete")
public CommonResult<User> deleteByUsername(
    @Valid @RequestParam(value = "username") @Size(min = 6, max = 20, message = "用户名长度不在指定范围内") String username) {
    User user = new User(1L, username, "A123456sd", 20, "zhaoyun123@xxx.com", "黄金");
    return CommonResult.ok("根据用户名删除用户成功", user);
}

全局异常处理类中新增以下方法:

@ExceptionHandler(ConstraintViolationException.class)
@ResponseStatus(code = HttpStatus.INTERNAL_SERVER_ERROR)
public CommonResult<Map<String, String>> handleConstraintViolationException(ConstraintViolationException e) {
    Map<String, String> errors = new HashMap<>(16);
    e.getConstraintViolations().forEach(constraintViolation -> errors
        .put(constraintViolation.getPropertyPath().toString(), constraintViolation.getMessage()));
    return CommonResult.fail(HttpStatus.INTERNAL_SERVER_ERROR.value(), "无效的参数", errors);
}

发送如下GET请求,请求地址为http://localhost:8080/user/get/0

发送如下DELETE请求,请求地址为http://localhost:8080/user/delete?username=ZhaoZiLong_1896582826

五、校验Service中的参数

通过@Validated@Valid注解组合使用不仅可以校验Controller中的参数,还可以校验任何Spring组件中的参数。

UserService

package com.rtxtitanv.service;

import com.rtxtitanv.model.CommonResult;
import com.rtxtitanv.model.User;
import org.springframework.validation.annotation.Validated;

import javax.validation.Valid;

/**
 * @author rtxtitanv
 * @version 1.0.0
 * @name com.rtxtitanv.service.UserService
 * @description UserService
 * @date 2021/8/15 16:46
 */
@Validated
public interface UserService {
    /**
     * 更新用户
     *
     * @param user 用户参数
     * @return CommonResult<User>
     */
    CommonResult<User> updateUser(@Valid User user);
}

UserService实现类:

package com.rtxtitanv.service.impl;

import com.rtxtitanv.model.CommonResult;
import com.rtxtitanv.model.User;
import com.rtxtitanv.service.UserService;
import org.springframework.stereotype.Service;

/**
 * @author rtxtitanv
 * @version 1.0.0
 * @name com.rtxtitanv.service.impl.UserServiceImpl
 * @description UserService实现类
 * @date 2021/8/15 16:46
 */
@Service
public class UserServiceImpl implements UserService {
    @Override
    public CommonResult<User> updateUser(User user) {
        return CommonResult.ok("更新用户成功", user);
    }
}

UserController中新增以下代码:

@Resource
private UserService userService;

@PutMapping("/update")
public CommonResult<User> updateUser(@RequestBody User user) {
    return userService.updateUser(user);
}

发送如下PUT请求,请求地址为http://localhost:8080/user/update

六、编程式校验

通过Validator实例可以手动进行参数校验。UserController中新增以下代码:

@Resource
private Validator validator;

@PostMapping("/insert")
public CommonResult<User> insertUser(@RequestBody User user) {
    if (!validator.validate(user).isEmpty()) {
        throw new ConstraintViolationException(validator.validate(user));
    }
    return CommonResult.ok("添加用户成功", user);
}

发送如下POST请求,请求地址为http://localhost:8080/user/insert

七、自定义校验注解

如果自带的校验注解无法满足需求,还可以自定义校验注解。首先创建如下注解用于密码校验:

package com.rtxtitanv.annotation;

import com.rtxtitanv.validator.PasswordValidator;

import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;

/**
 * @author rtxtitanv
 * @version 1.0.0
 * @name com.rtxtitanv.annotation.Password
 * @description 自定义密码校验注解
 * @date 2021/8/16 14:54
 */
@Documented
@Constraint(validatedBy = PasswordValidator.class)
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Password {

    String message() default "无效密码";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};
}

然后创建ConstraintValidator接口的实现类并重写isValid方法:

package com.rtxtitanv.validator;

import com.rtxtitanv.annotation.Password;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

/**
 * @author rtxtitanv
 * @version 1.0.0
 * @name com.rtxtitanv.validator.PasswordValidator
 * @description PasswordValidator
 * @date 2021/8/16 15:01
 */
public class PasswordValidator implements ConstraintValidator<Password, String> {
    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        if (value == null) {
            return true;
        }
        // 密码必须以大写英文字母开头,只包含英文字母、数字、下划线,长度在6到20之间
        return value.matches("^[A-Z][A-Za-z0-9_]{5,19}$");
    }
}

创建如下注解用于密码校验:

package com.rtxtitanv.annotation;

import com.rtxtitanv.validator.RankValidator;

import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;

/**
 * @author rtxtitanv
 * @version 1.0.0
 * @name com.rtxtitanv.annotation.Rank
 * @description 自定义用户段位校验注解
 * @date 2021/8/16 15:12
 */
@Documented
@Constraint(validatedBy = RankValidator.class)
@Target({ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface Rank {

    String message() default "rank值无效";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};
}

创建ConstraintValidator接口的实现类并重写isValid方法,:

package com.rtxtitanv.validator;

import com.rtxtitanv.annotation.Rank;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.HashSet;

/**
 * @author rtxtitanv
 * @version 1.0.0
 * @name com.rtxtitanv.validator.RankValidator
 * @description RankValidator
 * @date 2021/8/16 15:18
 */
public class RankValidator implements ConstraintValidator<Rank, String> {
    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        HashSet<String> ranks = new HashSet<>();
        ranks.add("无段位");
        ranks.add("青铜");
        ranks.add("白银");
        ranks.add("黄金");
        ranks.add("铂金");
        ranks.add("钻石");
        // 段位必须为无段位、青铜、白银、黄金、铂金、钻石之一
        return ranks.contains(value);
    }
}

修改User类,使用自定义校验注解:

package com.rtxtitanv.model;

import com.rtxtitanv.annotation.Password;
import com.rtxtitanv.annotation.Rank;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.validator.constraints.Length;

import javax.validation.constraints.*;

/**
 * @author rtxtitanv
 * @version 1.0.0
 * @name com.rtxtitanv.model.User
 * @description 用户实体类
 * @date 2021/8/15 16:28
 */
@AllArgsConstructor
@NoArgsConstructor
@Data
public class User {
    @NotNull(message = "id不能为空")
    private Long id;
    @Length(min = 6, max = 20, message = "用户名长度不小于6,不超过20")
    @NotNull(message = "用户名不能为空")
    private String username;
    @Password(message = "密码必须以大写英文字母开头,只包含英文字母、数字、下划线,长度在6到20之间")
    @NotNull(message = "密码不能为空")
    private String password;
    @Max(value = 60, message = "年龄最大为60")
    @Min(value = 18, message = "年龄最小为18")
    @NotNull(message = "年龄不能为空")
    private Integer age;
    @Email(message = "邮箱格式不正确")
    @NotEmpty(message = "邮箱不能为空")
    private String email;
    @Rank(message = "段位必须为无段位、青铜、白银、黄金、铂金、钻石之一")
    private String rank;
}

发送如下POST请求,请求地址为http://localhost:8080/user/save

八、分组校验

在参数校验时如果想针对不同的方法使用不同的校验规则,则可以使用分组校验。下面创建两个用于分组校验的接口:

public interface AddUserGroup {}
public interface ModifyUserGroup {}

在User类的实例域id上添加以下注解:

@NotNull(message = "id不能为空", groups = ModifyUserGroup.class)
@Null(message = "id必须为空", groups = AddUserGroup.class)

不写groups属性,则为默认分组。

UserController中新增以下方法:

@PostMapping("/add")
public CommonResult<User> addUser(@RequestBody @Validated(value = AddUserGroup.class) User user) {
    return CommonResult.ok("新增用户成功", user);
}

@PutMapping("/modify")
public CommonResult<User> modifyUser(@RequestBody @Validated(value = ModifyUserGroup.class) User user) {
    return CommonResult.ok("修改用户成功", user);
}

发送如下POST请求,请求地址为http://localhost:8080/user/add

发送如下PUT请求,请求地址为http://localhost:8080/user/modify

根据测试结果可知,方法addUser的参数使用的@Null校验,方法modifyUser的参数使用的@NotNull校验,成功实现了分组校验。

九、嵌套的参数校验

一个实体中嵌套一个实体时,通过在嵌套的实体类型属性上添加@Valid注解,可以对嵌套的参数进行校验。

Account类:

package com.rtxtitanv.model;

import com.rtxtitanv.annotation.Password;
import lombok.Data;

import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

/**
 * @author rtxtitanv
 * @version 1.0.0
 * @name com.rtxtitanv.model.Account
 * @description 账户实体类
 * @date 2021/8/17 16:25
 */
@Data
public class Account {
    @NotNull(message = "账户id不能为空")
    private Long accountId;
    @Size(min = 6, max = 20, message = "账户名长度不小于6,不超过20")
    @NotNull(message = "账户名不能为空")
    private String accountName;
    @Password(message = "密码必须以大写英文字母开头,只包含英文字母、数字、下划线,长度在6到20之间")
    @NotNull(message = "账户密码不能为空")
    private String accountPassword;
}

Order类:

package com.rtxtitanv.model;

import lombok.Data;

import javax.validation.Valid;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;

/**
 * @author rtxtitanv
 * @version 1.0.0
 * @name com.rtxtitanv.model.Order
 * @description 订单实体类
 * @date 2021/8/17 16:55
 */
@Data
public class Order {
    @NotNull(message = "订单id不能为空")
    private Long orderId;
    @NotEmpty(message = "订单号不能为空")
    private String orderNumber;
    @NotEmpty(message = "订单描述信息不能为空")
    private String orderDescription;
    @Valid
    private Account account;
}

OrderController

package com.rtxtitanv.controller;

import com.rtxtitanv.model.CommonResult;
import com.rtxtitanv.model.Order;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.validation.Valid;

/**
 * @author rtxtitanv
 * @version 1.0.0
 * @name com.rtxtitanv.controller.OrderController
 * @description OrderController
 * @date 2021/8/17 17:00
 */
@RequestMapping("/order")
@RestController
@Validated
public class OrderController {

    @PostMapping("/save")
    public CommonResult<Order> saveOrder(@RequestBody @Valid Order order) {
        return CommonResult.ok("订单保存成功", order);
    }
}

发送如下POST请求,请求地址为http://localhost:8080/order/save,发现嵌套的参数也被校验:

代码示例

Github:https://github.com/RtxTitanV/springboot-learning/tree/master/springboot2.x-learning/springboot-validatorGitee:https://gitee.com/RtxTitanV/springboot-learning/tree/master/springboot2.x-learning/springboot-validator

到此这篇关于SpringBoot2.x 参数校验的文章就介绍到这了,更多相关SpringBoot参数校验内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • SpringBoot中自定义注解实现参数非空校验的示例

    前言 由于刚写项目不久,在写 web 后台接口时,经常会对前端传入的参数进行一些规则校验,如果入参较少还好,一旦需要校验的参数比较多,那么使用 if 校验会带来大量的重复性工作,并且代码看起来会非常冗余,所以我首先想到能否通过一些手段改进这点,让 Controller 层减少参数校验的冗余代码,提升代码的可阅读性. 经过阅读他人的代码,发现使用 annotation 注解是一个比较方便的手段,SpringBoot 自带的 @RequestParam 注解只会校验请求中该参数是否存在,但是该参数是

  • Springboot使用@Valid 和AOP做参数校验及日志输出问题

    项目背景 最近在项目上对接前端的的时候遇到了几个问题 1.经常要问前端要请求参数 2.要根据请求参数写大量if...else,代码散步在 Controller 中,影响代码质量 3.为了解决问题1,到处记日志,导致到处改代码 解决方案 为了解决这类问题,我使用了@Valid 做参数校验,并使用AOP记录前端请求日志 1.Bean实体类增加注解 对要校验的实体类增加注解,如果实体类中有List结构,就在List上加@Valid @Valid注解 注解 备注 @Null 只能为null @NotNu

  • SpringBoot如何优雅的处理校验参数的方法

    前言 做web开发有一点很烦人就是要校验参数,基本上每个接口都要对参数进行校验,比如一些格式校验 非空校验都是必不可少的.如果参数比较少的话还是容易 处理的一但参数比较多了的话代码中就会出现大量的IF ELSE就比如下面这样: 这个例子只是校验了一下空参数.如果需要验证邮箱格式和手机号格式校验的话代码会更多,所以介绍一下validator通过注解的方式进行校验参数. 什么是Validator Bean Validation是Java定义的一套基于注解的数据校验规范,目前已经从JSR 303的1.

  • springboot+dubbo+validation 进行rpc参数校验的实现方法

    注意:本文dubbo 版本 2.8.4 springboot 版本 2.0.4.RELEASE 项目结构 test-rest (前端消费着,controller 层,springboot+maven项目) test-api (dubbo服务 的 api ,只记录 service 接口和 model ,maven 项目) test-provider(dubbo 服务提供者,实际的数据库操作及业务层, springboot+maven项目 ) 背景: 使用springmvc做restful,使用du

  • SpringBoot集成validation校验参数遇到的坑

    公众号中分享了一篇文章,关于SpringBoot集成validation校验参数的,粉丝留言说有坑. 原留言如下: 有坑,你试试^A-\\d{12}-\\d{4}$,这条正则经过validate这个方法无论参数写的对不对都会报验证错误,而用main方法测试是正常的.. 话说,针对这种回复我是不太信了,直觉告诉我,肯定是这位粉丝用错了.但既然粉丝有疑问还是需要专门写一个demo来验证一下的.说写就写. SpringBoot集成validation 集成过程非常简单,在原项目的pom文件中直接引入如

  • Springboot集成JSR303参数校验的方法实现

    JSR303 是一套 JavaBean 参数校验的标准 1.pom导入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency> 2.注解类型 (1)空检查 @Null 验证对象是否为null @NotNull 验证对象是否不为null,

  • SpringBoot2.x 参数校验问题小结

    目录 一.引入依赖 二.实体类 三.常用的校验注解 四.校验Controller中的参数 五.校验Service中的参数 六.编程式校验 七.自定义校验注解 八.分组校验 九.嵌套的参数校验 本文主要对SpringBoot2.x参数校验进行简单总结,其中SpringBoot使用的2.4.5版本. 一.引入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring

  • python传递参数方式小结

    本文实例总结了python传递参数方式.分享给大家供大家参考.具体分析如下: 当形参如*arg时表示传入数组,当形参如**args时表示传入字典. def myprint(*commends,**map): for comm in commends: print comm for key in map.keys(): print key,map[key] myprint("hello","word",username="tian",name=&q

  • Spring MVC传递接收参数方式小结

    目录 一.通过实体Bean接收请求参数 二.通过处理方法的形参接收请求参数 三.通过HttpServletRequest接收请求参数 四.通过@PathVariable接收URL中的请求参数 五.通过@RequestParam接收请求参数 六.通过@ModelAttribute接收请求参数 大家在开发中经常会用到Spring MVC Controller来接收请求参数,主要常用的接收方式就是通过实体对象以及形参等方式.有些用于GET请求,有些用于POST请求,有些用于两者. 下面的几种常见的后台

  • Dubbo服务校验参数的解决方案

    目录 一.背景 二.解决方案 2.1maven依赖 2.2接口定义 2.3Dubbo服务提供者端配置 2.4Dubbo服务消费者端配置 2.5验证参数校验 三.定制Dubbo参数校验异常返回 3.1ValidationFilter&JValidator 3.2自定义参数校验异常返回 3.2.1自定义Filter 3.2.2自定义Filter的配置 3.3.3Dubbo服务配置 四.如何扩展校验注解 4.1定义校验注解 4.2配置定制Validator发现 五.总结 本文分享了如何对Dubbo服务

  • Node.js 的 GC 机制详解

    V8 的内存限制 在一般的后端开发语言中,在基本的内存使用上没有什么限制,然而在 Node 中通过 JavaScript 使用内存时就会发现只能使用部分内存(64位系统下约为1.4GB,32位系统下约为0.7GB).在这样的限制下,将会导致 Node 无法直接操作大内存对象. 造成这个问题的主要原因在于 Node 的 JavaScript 执行引擎 V8. 在 V8 中,所有的 JavaScript 对象都是通过堆来进行分配的.Node 提供了 V8 中内存的使用量查看方法 process.me

  • 浅谈Mybatis之参数传递的几种姿势

    目录 I. 环境配置 1. 项目配置 2. 数据库表 II. 参数传递 1. @Param注解 2. 单参数 3. 多参数 3. Map传参 4. POJO对象 5. 简单参数 + Map参数 6.小结 III. 不能错过的源码和相关知识点 在mybatis的日常开发中,mapper接口中定义的参数如何与xml中的参数进行映射呢?除了我们常用的@Param注解之外,其他的方式是怎样的呢? I. 环境配置 我们使用SpringBoot + Mybatis + MySql来搭建实例demo spri

  • 浅谈java中的重载和重写的区别

    目录 1.重载 小结: 2.重写 小结: 总结 1.重载 重载指在一个类中,具有多个相同名称的方法,他们的参数列表却不相同 (参数类型不同.参数个数不同甚至是参数顺序不同) 重载对返回类型没有要求,可以相同也可以不同,但是不能返回类型来判断他们是否是重载. 例如 package HelloWorld; public class Zuoye { public static void main(String[] args) { Zuoye z = new Zuoye(); z.fangfa1();

  • C语言零基础讲解指针和数组

    目录 一.指针和数组分析-上 1.数组的本质 2.指针的运算 3.指针的比较 4.小结 二.指针与数组分析-下 1.数组的访问方式 2.下标形式 VS 指针形式 3.a 和 &a 的区别 4.数组参数 5.小结 一.指针和数组分析-上 1.数组的本质 数组是一段连续的内存空间 数组的空间大小为 sizeof(array_type) * array_size 数组名可看做指向数组第一个元素的常量指针 下面看一段代码: #include <stdio.h> int main() { int

  • vue2从template到render模板编译入口详解

    目录 正文 1.template:模板获取 2.createCompiler:核心参数 3.createCompileToFunctionFn:缓存处理 4.compile:参数合并 小结 正文 在vue的渲染过程中,渲染核心逻辑是vm._update(vm._render(), hydrating),通过vm._render的执行获取到vNode,再通过vm._update的执行来将vNode渲染成真实视图. 其中,render函数的来源是: (1)用户手写: (2)通过vue-loader引

  • 通过Golang实现linux命令ls命令(命令行工具构建)

    目录 ls 命令 os.Args 读取参数 pflag 小结 ls 命令 要实现ls,首先先我们复习一下ls命令. ls不加任何参数,表示查询当前目录下的文件/文件夹 ls后面加上路径,列出所有,不包含隐藏文件/文件夹 ls -a列出所有,包括以.开头的隐藏文件 此命令还有很多功能,这一节的重点是命令行程度的编写,就实现上面四个. os.Args 读取参数 定义如下,一个数组.该数组长度由参数个数决定,第一个参数为程序本身,后面为参数列表. var Args []string 比如ls -l,A

随机推荐