二八佳人体似酥,腰间仗剑斩愚夫。虽然不见人头落,暗里教君骨髓枯。
上一章简单介绍了SpringBoot的yml配置文件(三),如果没有看过,请观看上一章
一. SpringBoot的热布署
在开发当中,如果我们的代码发生了改变,我们想让其生效,那么就需要重新启动服务,这样会浪费太多的时间。 我们希望不重启服务,当代码发生了改变,即使是微小的改变,也可以被检测到,这种方式就叫做热布署。SpringBoot很好的提供了这一支持。
老蝴蝶接下来,就验证一下 SpringBoot热布署操作。
一.一 通过maven创建 DevTools项目
老蝴蝶采用Maven的方式创建了 DevTools项目,用于验证热布署。
添加了一个 HelloController的响应类,进行响应字符串信息。 pom.xml 依赖,还是以前的那些依赖。
application.yml 配置信息是:
server:
port: 8027
servlet:
context-path: /Yue
一.二 无热布署时的操作
输入网址: http://localhost:8027/Yue/ 可以正常的响应数据。
这个时候,如果我们想改变 toHello()方法里面的响应信息,变成 "我是两个蝴蝶飞" 。
刷新浏览器,发现浏览器的响应信息依旧没有发生改变。
只有当我们重新启动服务器之后,刷新,才可以看到改变后的信息。
这是没有热布署的情况下,方法里面代码发生了一点点改变,也必须要重启服务器。
一.三 SpringBoot实现热布署操作
为了避免 Idea对热布署产生影响,我们需要先对Idea进行配置,允许Idea进行静态编译和动态编译。
一.三.一 Idea开启静态自动编译
File--->Settings--->Build,Execution,Deployment--->Compiler--->勾选 Build project automatically
一.三.二 Idea开启动态自动编译
按住快捷键 Ctrl+Shift+Alt+/ ,选中 Registry
会进入到
从这里面找到
compiler.automake.allow.when.app.running 和 compiler.document.save.enabled 选项 (按照字典顺序进行查询,老蝴蝶以前设置过,所以在最前面),进行勾选, 点击关闭,再次打开,就会发生已经勾选了。
一.三.三 pom.xml 中添加 devtools 热布署依赖
<!--导入自动热布署的依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
重启项目之后,先验证一下以前的 url可以正常的访问响应。
一.三.四 修改代码,进行验证
将输出信息改成 “我是两个蝴蝶飞,我突然不开心了”
会发现,控制台会自动重启了
刷新浏览器,会发生改变
一.三.五 自动热布署并不是万能的
刚才,我们只是简单的修改方法内的代码,我们在实际开发中,除了修改方法内的代码,还常常创建新的方法和创建类文件。
这个时候,看看会是什么效果?
一.三.五.一 创建新方法
添加一个新方法 helloWorld()
控制台并没有重启
访问地址: http://localhost:8027/Yue/helloWorld
会发现,
报错了。
我们可以将其与 Idea 进行整合使用, Idea 使用 ctrl+F9会自动编译
点击 Yes ,刷新浏览器,可以发现,能够生效了。
一.三.五.二 创建新类
创建一个新的 InfoController 类,看看效果。
控制台并没有重新启动
需要 搭配 Ctrl+F9 一块使用,才可以。
自动热部署 ,生产环境时应该被禁用,打包时,也不会包含此 devtools.
二. SpringBoot的多环境配置
在我们实际开发中,常常会有多种环境, 开发环境,测试环境,预生产环境,生产环境,这些环境的配置是不相同的(数据库信息一定不同)。 以前只有一个配置文件,不同的环境进行转换时,需要将配置文件进行替换,这样很不方便。 如果能够在一个总的配置文件里面,指定这次运行加载的配置文件就好了, 或者能在环境运行时,指定就更好了。 SpringBoot提供了这种支持,叫做多环境转换。
老蝴蝶这儿用 开发,测试,生产 三个环境进行演示,环境的区别,只用简单的端口号和项目路径进行表示。
以前的 application.yml 配置文件信息是这样:
常见的有三种配置方式。
二.一 多个配置文件,主配置文件进行指定
二.一.一 创建多个配置文件信息
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 # 指定要使用哪一个环境
此时,使用的是开发环境。
二.一.三 测试运行
控制台打印输出 :
发现,使用的确实是 开发环境。
将 application.yml 中的配置 spring.profiles.active 改成 test
spring:
profiles:
active: test # 指定要使用哪一个环境
重新运行项目,观察控制台输出:
发现,变成 了 8082, /Yue2, 这些确实是 test测试环境的配置。
将 application.yml 中的配置 spring.profiles.active 改成 proc ,
spring:
profiles:
active: proc # 指定要使用哪一个环境
重启项目后,观察控制台输出
发现,变成 了 8083, /Yue3, 这些确实是 proc生产环境的配置。
如果将 spring.profiles.active 改成 yuejl, 一个不存在的配置文件呢?
spring:
profiles:
active: yuejl # 指定要使用哪一个环境
重启项目,观察控制台输出
会采用 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
运行成功之后,会生成一个 jar包
二.三.二.一 不指定环境
采用 java -jar 的方法进行运行, 先不指定环境
D:\githubBoot\springboot\DevTools\target>java -jar learn-1.0-SNAPSHOT.jar
默认的配置会生效。
二.三.二.二 指定为开发环境
java -jar learn-1.0-SNAPSHOT.jar --spring.profiles.active=dev
二.三.二.三 指定为测试环境
java -jar learn-1.0-SNAPSHOT.jar --spring.profiles.active=test
二.三.二.四 指定为生产环境
java -jar learn-1.0-SNAPSHOT.jar --spring.profiles.active=proc
二.三.二.五 指定一个不存在的环境时
java -jar learn-1.0-SNAPSHOT.jar --spring.profiles.active=yuejl
会走默认的。
注意, 在 java -jar 时指定运行环境的优先级最高,比直接在配置文件中指定优先级高,所以既在配置文件中指定了,又在 java -jar 时指定了,以 java -jar 时为准。
本章节的代码放置在 github 上:
https://github.com/yuejianli/springboot/tree/develop/DevTools
谢谢您的观看,如果喜欢,请关注我,再次感谢 !!!