一.热部署

1.1 什么是热部署

首先来看重启和重载的区别

重启(Restart):自定义开发代码,包含类、页面、配置文件等,加载位置restart类加载器

重载(ReLoad):jar包,加载位置base类加载器

而热部署仅仅加载当前开发者自定义开发的资源,不加载jar资源。也就是说热部署只会重启项目,不会重载项目。

1.2 手工启动热部署

第一步:开启开发者工具

springboot代码实现项目重启 springboot 重启自己_springboot代码实现项目重启

第二步:在idea中按Ctrl+F9,激活热部署 

springboot代码实现项目重启 springboot 重启自己_springboot代码实现项目重启_02

1.3 自动启动热部署

第一步:在settings中找到Compiler,勾选Build project auttomatically

springboot代码实现项目重启 springboot 重启自己_后端_03

 第二步:在Settings中找到Advanced Settings,勾选Allow auto-make to start....即可

springboot代码实现项目重启 springboot 重启自己_spring boot_04

 第三步:idea会在失去焦点5秒后,自动启动热部署

1.4 热部署范围配置

1.4.1 默认不触发重启的目录列表

/META-INF/maven

/META-INF/resources

/resources

/static

/public

/templates

1.4.2 自定义不参与重启的排除项

springboot代码实现项目重启 springboot 重启自己_springboot代码实现项目重启_05

1.5 禁用热部署

可以通过设置高优先级属性禁用热部署,例如在主启动类中添加以下代码即可。

springboot代码实现项目重启 springboot 重启自己_后端_06

 二.SpringBoot配置高级

2.1 @ConfigurationProperties

@ConfigurationProperties注解既可以为自定义的bean绑定属性,也可以为第三方bean绑定属性。

为自定义的bean绑定属性前边已经介绍过,下面介绍为第三方bean绑定属性。

第一步:在aplication.yml配置文件中添加以下内容

springboot代码实现项目重启 springboot 重启自己_spring boot_07

第二步:在第三方bean上添加注解@ConfigurationProperties(prefix="datasource"),即可为第三方bean中属性名为driverClassName的属性绑定值。

springboot代码实现项目重启 springboot 重启自己_spring_08

注意:@EnableConfigurationProperties({添加了@ConfigurationProperties的class文件})注解可以将使用了@ConfigurationProperties注解对应的自定义的类加入Spring容器。所以,@EnableConfigurationProperties与@Component不能同时使用,因为会将同一个bean加入二次spring容器,从而造成程序出错。

2.2 宽松绑定

@ConfigurationProperties绑定属性支持属性名宽松绑定。直接通过例子来介绍一下所谓的宽松绑定。

首先,创建一个ServerConfig类,并在其上方添加@ConfigurationProperties(prefix="servers")注解


springboot代码实现项目重启 springboot 重启自己_后端_09


其次,在application.yml中的配置可以写成如下几种形式,以下的四种写法都可以为ServerConfig类中的属性赋上值,这就是所谓的宽松绑定。

第一种:驼峰模式

springboot代码实现项目重启 springboot 重启自己_spring_10

第二种:下划线模式

springboot代码实现项目重启 springboot 重启自己_spring_11

第三种:中划线模式

springboot代码实现项目重启 springboot 重启自己_java_12

第四种:常量模式

springboot代码实现项目重启 springboot 重启自己_spring_13

注意:

1.宽松绑定不支持注解 @Value 引用单个属性的方式

2.绑定前缀名命名规范:仅能使用纯小写字母、数字、下划线作为合法的字符

2.3 常用计量单位

SpringBoot支持JDK8提供的时间与空间计量单位,分别是

  • 时间计量单位:Duration、
  • 空间计量单位:DataSize

通过在属性上面添加对应的注解来规定此属性的单位。


springboot代码实现项目重启 springboot 重启自己_spring boot_14


2.4 数据校验

开启数据校验有助于系统安全性,J2EE规范中JSR303规范定义了一组有关数据校验相关的API。

2.4.1 校验注解

JSR 提供的校验注解

  • @Null 被注释的元素必须为 null
  • @NotNull 被注释的元素必须不为 null
  • @AssertTrue 被注释的元素必须为 true
  • @AssertFalse 被注释的元素必须为 false
  • @Min(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
  • @Max(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
  • @DecimalMin(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
  • @DecimalMax(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
  • @Size(max=, min=) 被注释的元素的大小必须在指定的范围内
  • @Digits (integer, fraction) 被注释的元素必须是一个数字,其值必须在可接受的范围内
  • @Past 被注释的元素必须是一个过去的日期
  • @Future 被注释的元素必须是一个将来的日期
  • @Pattern(regex=,flag=) 被注释的元素必须符合指定的正则表达式

Hibernate Validator 提供的校验注解:

  • @NotBlank(message =) 验证字符串非 null,且长度必须大于 0
  • @Email 被注释的元素必须是电子邮箱地址
  • @Length(min=,max=) 被注释的字符串的大小必须在指定的范围内
  • @NotEmpty 被注释的字符串的必须非空
  • @Range(min=,max=,message=) 被注释的元素必须在合适的范围内

2.4.2 开启数据校验步骤

第一步:添加 JSR303 规范坐标与 Hibernate 校验框架对应坐标

springboot代码实现项目重启 springboot 重启自己_java_15

第二步:开始校验

校验请求体(@RequestBody)

通过校验注解为属性添加校验规则

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Person {

    @NotNull(message = "classId 不能为空")
    private String classId;

    @Size(max = 33)
    @NotNull(message = "name 不能为空")
    private String name;

    @Pattern(regexp = "((^Man$|^Woman$|^UGM$))", message = "sex 值不在可选范围")
    @NotNull(message = "sex 不能为空")
    private String sex;

    @Email(message = "email 格式不正确")
    @NotNull(message = "email 不能为空")
    private String email;

}

我们在需要验证的参数上加上了@Valid 注解,如果验证失败,它将抛出MethodArgumentNotValidException。默认情况下,Spring 会将此异常转换为 HTTP Status 400(错误请求)。

@RestController
@RequestMapping("/api")
public class PersonController {

    @PostMapping("/person")
    public ResponseEntity<Person> getPerson(@RequestBody @Valid Person person) {
        return ResponseEntity.ok().body(person);
    }
}

校验请求参数(@RequestParam、@PathVariable)

校验请求参数时,除了在方法参数前面加上@Valid注解之外,也不要忘记在类上加上 @Validated 注解,这个注解可以告诉 Spring 去校验方法参数。

@RestController
@RequestMapping("/api")
@Validated
public class PersonController {

    @GetMapping("/person/{id}")
    public ResponseEntity<Integer> getPersonByID(@Valid @PathVariable("id") @Max(value = 5,message = "超过 id 的范围了") Integer id) {
        return ResponseEntity.ok().body(id);
    }
}