springboot学习四:Spring Boot profile多环境配置、devtools热部署

简介: 这篇文章主要介绍了如何在Spring Boot中进行多环境配置以及如何整合DevTools实现热部署,以提高开发效率。

导言

上接博文:springboot学习三:Spring Boot 配置文件语法、静态工具类读取配置文件

二、Spring Boot Profile 多环境配置

1. 介绍

我们在开发项目时,通常同一套程序会被发布到几个不同的环境,比如:开发、测试、生产等。其中每个环境的数据库地址、redis地 址、服务器端口等等配置都会不同,如果在为不同环境打包时都要频繁修改配置文件的话,那必将是个非常繁琐且容易发生错误的事。

对于多环境的配置,各种项目构建工具或是框架的基本思路是一致的,通过配置多份不同环境的配置文件,再通过打包命令指定需要 打包的内容之后进行区分打包,而Spring Boot 就更简单了,打好包后,只需在不同的环境下启动时候指定读取的配置文件就可以了。

在Spring Boot中多环境配置文件名需要满足application-{profile}.properties的格式,其中{profile}对应你的环境标识,比如:

  • application-dev.properties:开发环境
  • application-test.properties:测试环境
  • application-prod.properties:生产环境

至于哪个具体的配置文件会被加载,需要在application.properties文件中通过spring.profiles.active属性来设置,其值对应{profile} 值。
如:spring.profiles.active=test就会加载application-test.properties配置文件内容

2. 创建项目

  1. 项目细节
    在这里插入图片描述
  2. 项目插件(这里的版本,创建完项目后,我手动改成了2.7.2)在这里插入图片描述
  3. 修改配置文件为:application.yml
  4. 项目结构
    在这里插入图片描述

3. 创建多个 配置文件

在这里插入图片描述

4. 每个环境 设置branch分支的值

  • application.yml 默认dev
#默认使用dev的配置
spring:
  profiles:
    active: dev
  • application-dev.yml 端口8080

  • application-prod.yml 端口8081

  • application-test.yml 端口8082

server:
  port: 8082

branch: test

5. 测试类 controller

package com.feng.springBoot_profile.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/test")
public class HelloController {

    @Value("${branch}")
    private String branch;

    @GetMapping("/branch")
    public String test(){
        return "Spring Boot Current branch :" + branch;
    }
}

6. 测试

a、测试:测试环境

  1. cd target
    在这里插入图片描述
  2. 进入到 jar同级执行 java -jar springboot_profile-0.0.1-SNAPSHOT.jar --spring.profiles.active=test
  3. 运行成功
    在这里插入图片描述
    在这里插入图片描述

b、测试:生产环境

  1. 在项目终端:ctrl+c,终止当前进程
  2. 然后执行命令: java -jar springboot_profile-0.0.1-SNAPSHOT.jar --spring.profiles.active=prod
  3. 运行成功
    在这里插入图片描述
  4. 测试成功
    在这里插入图片描述

7. 项目结构

在这里插入图片描述

五、Spring Boot 整合 devtools热部署

csdn 其他人的文档,挺好的,值得一看:https://blog.csdn.net/u014163312/article/details/120565270

1. 介绍

  • 是什么?
    spring为开发者提供了一个名为spring-boot-devtools的模块来使Spring Boot应用支持热部署,提高开发者的开发效率,无需手动重启Spring Boot应用。

  • devtools的原理
    底层原理是使用了两个ClassLoader,一个Classloader加载那些不会改变的类(第三方Jar包),另一个ClassLoader加载会更改的类,称为restart ClassLoader,这样在有代码更改的时候,原来的restart ClassLoader 被丢弃,重新创建一个restart ClassLoader,由于需要加载的类相比较少,所以实现了较快的重启时间。

2. 创建工程(重要的依赖)

  1. 项目细节
    在这里插入图片描述
  2. 引入依赖 web和DevTools (这里的版本,创建完项目后,我手动改成了2.7.2)
    在这里插入图片描述
  3. 修改配置名称为:application.yml
  4. 项目结构
    在这里插入图片描述

3. 引入 依赖(创建项目时已经引入)

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>

4. 配置 plugin

加入 pligin 且配置一个属性 fork 为 true

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
               <configuration>
                   <fork>true</fork> <!-- 如果没有该配置,devtools不会生效 -->
               </configuration>
        </plugin>
    </plugins>
</build>

在这里插入图片描述

5. 开启自动编译

  • 当我们修改了Java类后,IDEA默认是不自动编译的,而spring-boot-devtools又是监测classpath下的文件发生变化才会重启应用,所以需要设置IDEA的自动编译:

  • 系统设置

    • Windows: Ctrl+Alt+S
    • MacOS:command +
  • 选择 File | Settings | Compiler 命令,然后勾选 Build project automatically 复选框,低版本的 IDEA 请勾选 make projectautomatically 复选框。
    在这里插入图片描述

6. 配置auto-make

IDEA 设置运行程中,设置允许自动编译

a、旧版本:2021之前

  • Windows快捷键:Ctrl + Shift + Alt + /
  • MacOS快捷键:双击shift,打开查找页面,输入reg
  • 操作: 勾选勾上 Compiler autoMake allow when app running
    意思是:

Allow auto-make to start even if developed application is currently running. Note that automatically started make may eventually delete some classes that are required by the application.

在这里插入图片描述

b、新版本:2021之后

2021之后的版本被迁移到了这里
在这里插入图片描述

c、重启 IDEA

7. devtools的配置

a、properties文件

application.properties 中配置 spring.devtools.restart.enabled=false ,此时restart类加载器还会初始化,但不会监视文件更新。

#热部署生效
spring.devtools.restart.enabled: true
#设置重启的目录
#spring.devtools.restart.additional-paths: src/main/java
#classpath目录下的WEB-INF文件夹内容修改不重启
spring.devtools.restart.exclude: WEB-INF/**

在SprintApplication.run之前调用System.setProperty(“spring.devtools.restart.enabled”, “false”);可以完全关闭重启支持,配置内容

public static void main(String[] args) {
    System.setProperty("spring.devtools.restart.enabled", "false");
    SpringApplication.run(MyApp.class, args);
}

b、yml文件

spring:
  devtools:
    restart:
      enabled: true # 热部署开关
    freemarker:
      cache: false # 页面不加载缓存,修改即时生效

8. 测试

  • 修改类–>保存:应用会重启
  • 修改配置文件–>保存:应用会重启

9. 扩展

以下信息,来自于spring boot官方:

Developer tools are automatically disabled when running a fully packaged application.
If your application is launched from java -jar or if it is started from a special classloader, then it is considered a “production application”.
You can control this behavior by using the spring.devtools.restart.enabled system property.
To enable devtools, irrespective of the classloader used to launch your application, set the -Dspring.devtools.restart.enabled=true system property.
This must not be done in a production environment where running devtools is a security risk.
To disable devtools, exclude the dependency or set the -Dspring.devtools.restart.enabled=false system property.

相关文章
|
1天前
|
编解码 Java 程序员
写代码还有专业的编程显示器?
写代码已经十个年头了, 一直都是习惯直接用一台Mac电脑写代码 偶尔接一个显示器, 但是可能因为公司配的显示器不怎么样, 还要接转接头 搞得桌面杂乱无章,分辨率也低,感觉屏幕还是Mac自带的看着舒服
|
3天前
|
存储 缓存 关系型数据库
MySQL事务日志-Redo Log工作原理分析
事务的隔离性和原子性分别通过锁和事务日志实现,而持久性则依赖于事务日志中的`Redo Log`。在MySQL中,`Redo Log`确保已提交事务的数据能持久保存,即使系统崩溃也能通过重做日志恢复数据。其工作原理是记录数据在内存中的更改,待事务提交时写入磁盘。此外,`Redo Log`采用简单的物理日志格式和高效的顺序IO,确保快速提交。通过不同的落盘策略,可在性能和安全性之间做出权衡。
1540 5
|
1月前
|
弹性计算 人工智能 架构师
阿里云携手Altair共拓云上工业仿真新机遇
2024年9月12日,「2024 Altair 技术大会杭州站」成功召开,阿里云弹性计算产品运营与生态负责人何川,与Altair中国技术总监赵阳在会上联合发布了最新的“云上CAE一体机”。
阿里云携手Altair共拓云上工业仿真新机遇
|
7天前
|
人工智能 Rust Java
10月更文挑战赛火热启动,坚持热爱坚持创作!
开发者社区10月更文挑战,寻找热爱技术内容创作的你,欢迎来创作!
577 22
|
3天前
|
存储 SQL 关系型数据库
彻底搞懂InnoDB的MVCC多版本并发控制
本文详细介绍了InnoDB存储引擎中的两种并发控制方法:MVCC(多版本并发控制)和LBCC(基于锁的并发控制)。MVCC通过记录版本信息和使用快照读取机制,实现了高并发下的读写操作,而LBCC则通过加锁机制控制并发访问。文章深入探讨了MVCC的工作原理,包括插入、删除、修改流程及查询过程中的快照读取机制。通过多个案例演示了不同隔离级别下MVCC的具体表现,并解释了事务ID的分配和管理方式。最后,对比了四种隔离级别的性能特点,帮助读者理解如何根据具体需求选择合适的隔离级别以优化数据库性能。
201 3
|
10天前
|
JSON 自然语言处理 数据管理
阿里云百炼产品月刊【2024年9月】
阿里云百炼产品月刊【2024年9月】,涵盖本月产品和功能发布、活动,应用实践等内容,帮助您快速了解阿里云百炼产品的最新动态。
阿里云百炼产品月刊【2024年9月】
|
10天前
|
Linux 虚拟化 开发者
一键将CentOs的yum源更换为国内阿里yum源
一键将CentOs的yum源更换为国内阿里yum源
571 5
|
23天前
|
存储 关系型数据库 分布式数据库
GraphRAG:基于PolarDB+通义千问+LangChain的知识图谱+大模型最佳实践
本文介绍了如何使用PolarDB、通义千问和LangChain搭建GraphRAG系统,结合知识图谱和向量检索提升问答质量。通过实例展示了单独使用向量检索和图检索的局限性,并通过图+向量联合搜索增强了问答准确性。PolarDB支持AGE图引擎和pgvector插件,实现图数据和向量数据的统一存储与检索,提升了RAG系统的性能和效果。
|
6天前
|
XML 安全 Java
【Maven】依赖管理,Maven仓库,Maven核心功能
【Maven】依赖管理,Maven仓库,Maven核心功能
233 3
|
9天前
|
存储 人工智能 搜索推荐
数据治理,是时候打破刻板印象了
瓴羊智能数据建设与治理产品Datapin全面升级,可演进扩展的数据架构体系为企业数据治理预留发展空间,推出敏捷版用以解决企业数据量不大但需构建数据的场景问题,基于大模型打造的DataAgent更是为企业用好数据资产提供了便利。
327 2