二八佳人体似酥,腰间仗剑斩愚夫。虽然不见人头落,暗里教君骨髓枯。

上一章简单介绍了SpringBoot的yml配置文件(三),如果没有看过,​​请观看上一章​​

一. SpringBoot的热布署

在开发当中,如果我们的代码发生了改变,我们想让其生效,那么就需要重新启动服务,这样会浪费太多的时间。 我们希望不重启服务,当代码发生了改变,即使是微小的改变,也可以被检测到,这种方式就叫做热布署。SpringBoot很好的提供了这一支持。

老蝴蝶接下来,就验证一下 SpringBoot热布署操作。

一.一 通过maven创建 DevTools项目

老蝴蝶采用Maven的方式创建了 DevTools项目,用于验证热布署。

添加了一个 HelloController的响应类,进行响应字符串信息。 pom.xml 依赖,还是以前的那些依赖。

application.yml 配置信息是:

server:
port: 8027
servlet:
context-path: /Yue

SpringBoot的热布署和多环境配置(四)_SpringBoot入门

一.二 无热布署时的操作

输入网址: http://localhost:8027/Yue/ 可以正常的响应数据。

SpringBoot的热布署和多环境配置(四)_配置文件_02

这个时候,如果我们想改变 toHello()方法里面的响应信息,变成 “我是两个蝴蝶飞” 。

SpringBoot的热布署和多环境配置(四)_SpringBoot入门_03

刷新浏览器,发现浏览器的响应信息依旧没有发生改变。

SpringBoot的热布署和多环境配置(四)_SpringBoot的热布署_04

只有当我们重新启动服务器之后,刷新,才可以看到改变后的信息。

SpringBoot的热布署和多环境配置(四)_多环境配置_05

这是没有热布署的情况下,方法里面代码发生了一点点改变,也必须要重启服务器。

一.三 SpringBoot实现热布署操作

为了避免 Idea对热布署产生影响,我们需要先对Idea进行配置,允许Idea进行静态编译和动态编译。

一.三.一 Idea开启静态自动编译

File—>Settings—>Build,Execution,Deployment—>Compiler—>勾选 Build project automatically

SpringBoot的热布署和多环境配置(四)_SpringBoot入门_06

一.三.二 Idea开启动态自动编译

按住快捷键 Ctrl+Shift+Alt+/ ,选中 Registry

SpringBoot的热布署和多环境配置(四)_多环境配置_07

会进入到

SpringBoot的热布署和多环境配置(四)_SpringBoot的热布署_08

从这里面找到

compiler.automake.allow.when.app.running 和 compiler.document.save.enabled 选项 (按照字典顺序进行查询,老蝴蝶以前设置过,所以在最前面),进行勾选, 点击关闭,再次打开,就会发生已经勾选了。

SpringBoot的热布署和多环境配置(四)_多环境配置_09

一.三.三 pom.xml 中添加 devtools 热布署依赖

<!--导入自动热布署的依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>

SpringBoot的热布署和多环境配置(四)_SpringBoot的热布署_10

重启项目之后,先验证一下以前的 url可以正常的访问响应。

SpringBoot的热布署和多环境配置(四)_SpringBoot的热布署_11

一.三.四 修改代码,进行验证

将输出信息改成 “我是两个蝴蝶飞,我突然不开心了”

SpringBoot的热布署和多环境配置(四)_多环境配置_12

会发现,控制台会自动重启了

SpringBoot的热布署和多环境配置(四)_SpringBoot入门_13

刷新浏览器,会发生改变

SpringBoot的热布署和多环境配置(四)_spring_14

一.三.五 自动热布署并不是万能的

刚才,我们只是简单的修改方法内的代码,我们在实际开发中,除了修改方法内的代码,还常常创建新的方法和创建类文件。

这个时候,看看会是什么效果?

一.三.五.一 创建新方法

添加一个新方法 helloWorld()

SpringBoot的热布署和多环境配置(四)_配置文件_15

控制台并没有重启

访问地址: http://localhost:8027/Yue/helloWorld

会发现,

SpringBoot的热布署和多环境配置(四)_spring_16

报错了。

我们可以将其与 Idea 进行整合使用, Idea 使用 ctrl+F9会自动编译

SpringBoot的热布署和多环境配置(四)_SpringBoot入门_17

点击 Yes ,刷新浏览器,可以发现,能够生效了。

SpringBoot的热布署和多环境配置(四)_多环境配置_18

一.三.五.二 创建新类

创建一个新的 InfoController 类,看看效果。

SpringBoot的热布署和多环境配置(四)_配置文件_19

控制台并没有重新启动

SpringBoot的热布署和多环境配置(四)_SpringBoot入门_20

需要 搭配 Ctrl+F9 一块使用,才可以。

SpringBoot的热布署和多环境配置(四)_SpringBoot的热布署_21

自动热部署 ,生产环境时应该被禁用,打包时,也不会包含此 devtools.

SpringBoot的热布署和多环境配置(四)_spring_22

二. SpringBoot的多环境配置

在我们实际开发中,常常会有多种环境, 开发环境,测试环境,预生产环境,生产环境,这些环境的配置是不相同的(数据库信息一定不同)。 以前只有一个配置文件,不同的环境进行转换时,需要将配置文件进行替换,这样很不方便。 如果能够在一个总的配置文件里面,指定这次运行加载的配置文件就好了, 或者能在环境运行时,指定就更好了。 SpringBoot提供了这种支持,叫做多环境转换。

老蝴蝶这儿用 开发,测试,生产 三个环境进行演示,环境的区别,只用简单的端口号和项目路径进行表示。

以前的 application.yml 配置文件信息是这样:

SpringBoot的热布署和多环境配置(四)_多环境配置_23

常见的有三种配置方式。

二.一 多个配置文件,主配置文件进行指定

二.一.一 创建多个配置文件信息

SpringBoot的热布署和多环境配置(四)_多环境配置_24

application.yml 是主配置文件信息, application-dev.yml 是开发环境的配置。

application-test 是测试环境的配置, application-proc 是生产环境的配置。

注意,新添加的配置文件的命名,一定要是 application-xxx.yml

二.一.二 为不同的配置文件设置不同的配置信息

二.二.二.一 开发环境 dev 配置

server:
port: 8081
servlet:
context-path: /Yue1

二.二.二.二 测试环境 test 配置

server:
port: 8082
servlet:
context-path: /Yue2

二.二.二.三 生产环境 proc配置

server:
port: 8083
servlet:
context-path: /Yue3

二.二.二.四 主环境配置

用 spring.profiles.active 属性指定使用哪一个配置文件。

# 将以前的配置去除
#server:
# port: 8027
# servlet:
# context-path: /Yue
spring:
profiles:
active: dev # 指定要使用哪一个环境

此时,使用的是开发环境。

二.一.三 测试运行

控制台打印输出 :

SpringBoot的热布署和多环境配置(四)_SpringBoot入门_25

发现,使用的确实是 开发环境。

将 application.yml 中的配置 spring.profiles.active 改成 test

spring:
profiles:
active: test # 指定要使用哪一个环境

重新运行项目,观察控制台输出:

SpringBoot的热布署和多环境配置(四)_SpringBoot的热布署_26

发现,变成 了 8082, /Yue2, 这些确实是 test测试环境的配置。

将 application.yml 中的配置 spring.profiles.active 改成 proc ,

spring:
profiles:
active: proc # 指定要使用哪一个环境

重启项目后,观察控制台输出

SpringBoot的热布署和多环境配置(四)_SpringBoot入门_27

发现,变成 了 8083, /Yue3, 这些确实是 proc生产环境的配置。

如果将 spring.profiles.active 改成 yuejl, 一个不存在的配置文件呢?

spring:
profiles:
active: yuejl # 指定要使用哪一个环境

重启项目,观察控制台输出

SpringBoot的热布署和多环境配置(四)_多环境配置_28

会采用 8080 空 这种默认的配置。

二.二 单配置文件配置

上面配置一个环境,需要四个配置文件信息,能不能放置在一个配置环境里面呢? 改变时,只改变那些有区分的信息,如数据库连接信息,端口号和项目名这些可以相同的配置,不用改变。 yaml 配置文件,支持这种方式, 用 — 进行分隔不同的配置文件。

二.二.一 单文件配置

application.yml 的配置文件总信息是:

# 将以前的配置去除
#server:
# port: 8027
# servlet:
# context-path: /Yue
spring:
profiles:
active: dev # 指定要使用哪一个环境

---
server:
port: 8081
servlet:
context-path: /Yue1
spring:
profiles: dev # 用 spring.profiles 设置配置文件的名称,是开发环境
---
server:
port: 8082
servlet:
context-path: /Yue2
spring:
profiles: test # 用 spring.profiles 设置配置文件的名称,是测试环境
---
server:
port: 8083
servlet:
context-path: /Yue3
spring:
profiles: proc # 用 spring.profiles 设置配置文件的名称,是生产环境

二.二.二 测试运行

测试运行时,效果与多个配置文件的效果一样,改变 spring.profiles.active 的值的话,可以动态的改变环境的配置信息。

老蝴蝶这儿就不重复粘贴了。

二.三 运行时指定

第二种方式,需要在配置文件里面用 spring.profiles.active 进行指定。 切换不同的环境的话,也需要改变其对应的值。

能不能在 java -jar 时指定运行哪一个配置文件呢? 是可以的, SpringBoot支持这种处理。

在 java -jar Xxx.jar 时,后面添加参数 --spring.profiles.active=dev(test,proc) 这样方式。

二.三.一 application.yml配置文件里面去掉 指定文件属性

# 将以前的配置去除
#server:
# port: 8027
# servlet:
# context-path: /Yue
---
server:
port: 8081
servlet:
context-path: /Yue1
spring:
profiles: dev # 用 spring.profiles 设置配置文件的名称,是开发环境
---
server:
port: 8082
servlet:
context-path: /Yue2
spring:
profiles: test # 用 spring.profiles 设置配置文件的名称,是测试环境
---
server:
port: 8083
servlet:
context-path: /Yue3
spring:
profiles: proc # 用 spring.profiles 设置配置文件的名称,是生产环境

二.三.二 通过maven 进行打包运行

mvn clean install

SpringBoot的热布署和多环境配置(四)_SpringBoot的热布署_29

运行成功之后,会生成一个 jar包

SpringBoot的热布署和多环境配置(四)_spring_30

二.三.二.一 不指定环境

采用 java -jar 的方法进行运行, 先不指定环境

D:\githubBoot\springboot\DevTools\target>java -jar learn-1.0-SNAPSHOT.jar

SpringBoot的热布署和多环境配置(四)_配置文件_31

SpringBoot的热布署和多环境配置(四)_SpringBoot的热布署_32

默认的配置会生效。

二.三.二.二 指定为开发环境

java -jar learn-1.0-SNAPSHOT.jar --spring.profiles.active=dev

SpringBoot的热布署和多环境配置(四)_配置文件_33

二.三.二.三 指定为测试环境

java -jar learn-1.0-SNAPSHOT.jar --spring.profiles.active=test

SpringBoot的热布署和多环境配置(四)_SpringBoot的热布署_34

二.三.二.四 指定为生产环境

java -jar learn-1.0-SNAPSHOT.jar --spring.profiles.active=proc

SpringBoot的热布署和多环境配置(四)_多环境配置_35

二.三.二.五 指定一个不存在的环境时

java -jar learn-1.0-SNAPSHOT.jar --spring.profiles.active=yuejl

SpringBoot的热布署和多环境配置(四)_SpringBoot入门_36

会走默认的。

注意, 在 java -jar 时指定运行环境的优先级最高,比直接在配置文件中指定优先级高,所以既在配置文件中指定了,又在 java -jar 时指定了,以 java -jar 时为准。

本章节的代码放置在 github 上:

​https://github.com/yuejianli/springboot/tree/develop/DevTools​

谢谢您的观看,如果喜欢,请关注我,再次感谢 !!!