Spring Boot 进阶之路:热部署机制 + 配置高级特性详解

一、热部署

简单说就是你程序改了,不用重启,服务器会自动的把更新后的程序给重新加载一遍,这就是热部署。
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;
}

最后感谢黑马程序员提供的优质学习资源,让我们在技术道路上能够站在巨人的肩膀上继续前行。本资料仅为学习过程的副产品,希望能帮助到更多同样在努力学习的开发者。

相关推荐
生命因何探索2 小时前
SpringBoot启动流程—面试热点
java·spring boot·面试
xiaoye37082 小时前
如何在Spring中使用注解解决线程并发问题?
java·后端·spring
future02102 小时前
Spring IOC启动全流程解密
java·后端·spring·ioc
太阳神LoveU2 小时前
Spring Boot 4.0.3和3.X的各个版本主要功能差别和优劣势对比
java·spring boot·后端
俩娃妈教编程2 小时前
C++基础知识点:位运算
java·开发语言·jvm·c++·位运算
zhoupenghui1682 小时前
golang 锁实现原理与解析&锁机制(sync)种类与举例说明以及其使用场景
开发语言·后端·golang·mutex·wait·lock·sync
掘金者阿豪2 小时前
从“多库掣肘”到“一库平川”:金仓KingbaseES的融合数据库深度体验
后端
夫唯不争,故无尤也2 小时前
原始文档元数据metadata
java·前端·javascript·sql
wefly20172 小时前
无需安装的 M3U8 在线播放器,快速实现 HLS 流预览与调试
java·开发语言·python·开发工具