一、热部署
简单说就是你程序改了,不用重启,服务器会自动的把更新后的程序给重新加载一遍,这就是热部署。
springboot 项目热部署实现原理
热部署 = 给项目配了个"监工",专门盯着你的代码文件。代码一变,监工立刻通知 Spring 只重新加载程序部分,不用重启整个服务器,开发效率大大提高!
1.1 手动启动热部署
导入开发者工具对应的坐标
xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
还需重新构建项目

重启与重载
一个 springboot 项目在运行时实际上是分两个过程进行的,根据加载的东西不同,划分成 base 类加载器与 restart 类加载器。
- base 类加载器:用来加载 jar 包中的类,jar 包中的类和配置文件由于往往不会发生变化。
- restart 类加载器:用来加载开发者自己开发的类、配置文件、页面等信息,这一类文件受开发者影响。
当 springboot 项目启动时,base 类加载器执行,加载 jar 包中的信息后,restart 类加载器执行,加载开发者制作的内容。当执行构建项目后,仅运行 restart 类加载即可完成热部署。
1.2 自动启动热部署
启用自动热部署,我们需要打开一个开关,在文件的设置 目录下找到构建、执行、部署 ,在目录下点击编译器 ,开启"自动构建项目 "。

还需开启"即使开发的应用程序当前正在运行,也允许自动make启动 "

1.3 参与热部署监控的文件范围配置
项目中的文件被修改,一些并不会触发热部署,配置中默认不参与热部署的目录信息如下:
- /META-INF/maven
- /META-INF/resources
- /resources
- /static
- /public
- /templates
如果想修改配置,可以通过 application.yml 文件进行设定哪些文件不参与热部署操作:
yaml
spring:
devtools:
restart:
# 设置不参与热部署的文件或文件夹
exclude: static/**,public/**,config/application.yml
1.4 关闭热部署
线上环境运行时是不可能使用热部署功能的,所以需要强制关闭此功能,通过配置可以关闭此功能。
yaml
spring:
devtools:
restart:
enabled: false
同样我们也可以通过系统属性设置关闭热部署功能:
java
@SpringBootApplication
public class SSMPApplication {
public static void main(String[] args) {
System.setProperty("spring.devtools.restart.enabled","false");
SpringApplication.run(SSMPApplication.class);
}
}
二、配置高级
2.1 @ConfigurationProperties
在基础篇学习了@ConfigurationProperties 注解,此注解的作用是用来为 bean 绑定属性的 。
例:在.yml文件中:
yaml
servers:
ip-address: 192.168.0.1
port: 2345
timeout: -1
一个用来封装数据的实体类,注意要提供属性对应的 setter 方法:
java
@Component
@Data
// 可省略为@ConfigurationProperties("servers")
@ConfigurationProperties(prefix = "servers")
public class ServerConfig {
private String ipAddress;
private int port;
private long timeout;
}
对于第三方bean来说,我们不可能到源码中去添加@ConfigurationProperties,但是依然可以使用@ConfigurationProperties 注解来加载。在 yml 中定义要绑定的属性,注意 datasource 此时全小写:
yaml
datasource:
driverClassName: com.mysql.jdbc.Driver
使用@ConfigurationProperties 注解为第三方 bean 进行属性绑定,注意前缀是全小写的 datasource:
java
@Bean
@ConfigurationProperties(prefix = "datasource")
public DruidDataSource datasource(){
DruidDataSource ds = new DruidDataSource();
return ds;
}
@ConfigurationProperties 注解不仅能添加到类上,还可以添加到方法上,添加到方法上是为 spring 容器管理的当前方法的返回值对象绑定属性。
@EnableConfigurationProperties
当各个类和方法上使用@ConfigurationProperties时,不便查找,于是我们可以使用@EnableConfigurationProperties注解,它让被 @ConfigurationProperties 标注的类生效,同样将配置类注册到 Spring 容器中。
java
@SpringBootApplication
@EnableConfigurationProperties(ServerConfig.class)
public class Springboot13ConfigurationApplication {
}
在对应的类上直接使用@ConfigurationProperties 进行属性绑定,不必声明@Component 注解:
java
@Data
@ConfigurationProperties(prefix = "servers")
public class ServerConfig {
private String ipAddress;
private int port;
private long timeout;
}
2.2 宽松绑定/松散绑定
宽松绑定实际上是 springboot 进行编程时人性化设计的一种体现,即配置文件中的命名格式与变量名的命名格式可以进行格式上的最大化兼容。springboot 官方推荐使用烤肉串模式,也就是中划线模式。
yaml
servers:
ipAddress: 192.168.0.2 # 驼峰模式
ip_address: 192.168.0.2 # 下划线模式
ip-address: 192.168.0.2 # 烤肉串模式
IP_ADDRESS: 192.168.0.2 # 常量模式
2.3 常用计量单位绑定(Duration 和 DataSize)
在配置中书写的时间和存储空间由于没有单位,在绑定属性时容易产生误解,springboot 充分利用了 JDK8 中提供的全新的用来表示计量单位的新数据类型,从根本上解决这个问题,分别是 Duration 和 DataSize:
java
@Component
@Data
@ConfigurationProperties(prefix = "servers")
public class ServerConfig {
@DurationUnit(ChronoUnit.HOURS)
private Duration serverTimeOut;
@DataSizeUnit(DataUnit.MEGABYTES)
private DataSize dataSize;
}
Duration :表示时间间隔,可以通过@DurationUnit 注解描述时间单位,例如上例中描述的单位为小时(ChronoUnit.HOURS)
DataSize:表示存储空间,可以通过@DataSizeUnit 注解描述存储空间单位,例如上例中描述的单位为 MB(DataUnit.MEGABYTES)
Druation 常用单位如下:

DataSize 常用单位如下:

2.4 校验
为了防止属性绑定时,出现类型不匹配等问题,SpringBoot 给出了强大的数据校验功能。在 JAVAEE 的 JSR303 规范中给出了具体的数据校验标准,开发者可以根据自己的需要选择对应的校验框架,此处使用 Hibernate 提供的校验框架来作为实现进行数据校验。
xml
<!--1.导入JSR303规范-->
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
</dependency>
<!--使用hibernate框架提供的校验器做实现-->
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
</dependency>
在需要开启校验功能的类上使用注解@Validated 开启校验功能,并对具体的字段设置校验规则:
java
@Component
@Data
@ConfigurationProperties(prefix = "servers")
//开启对当前bean的属性注入校验
@Validated
public class ServerConfig {
//设置具体的规则
@Max(value = 8888,message = "最大值不能超过8888")
@Min(value = 202,message = "最小值不能低于202")
private int port;
}
最后感谢黑马程序员提供的优质学习资源,让我们在技术道路上能够站在巨人的肩膀上继续前行。本资料仅为学习过程的副产品,希望能帮助到更多同样在努力学习的开发者。