Spring Boot工程应用篇(二)多环境选择(相同代码运行在不同环境、不同环境执行不同实现类、单配置文件实现多环境)

时间:2024-03-21 18:37:53

3. 多环境选择

3.1 什么是多环境选择

以下两种场景下需要进行“多环境选择”。

(1) 相同代码运行在不同环境

在开发应用时,通常同一套程序会被运行在多个不同的环境,例如,开发、测试、生产环境等。每个环境的数据库地址、服务器端口号等配置都会不同。若在不同环境下运行时将配置文件修改为不同内容,那么,这种做法不仅非常繁琐,而且很容易发生错误。

此时就需要定义出不同的配置信息,在不同的环境中自动选择不同的配置。

(2) 不同环境执行不同实现类

在开发应用时,有时不同的环境,需要运行的接口的实现类也是不同的。例如,若要开发一个具有短信发送功能的应用,开发环境中要执行的 send()方法仅需调用短信模拟器即可,而生产环境中要执行的 send()则需要调用短信运营商所提供的短信发送接口。

此时就需要开发两个相关接口的实现类去实现 send()方法,然后在不同的环境中自动选择不同的实现类去执行。

3.2 需求

下面将实现如下功能:存在开发与生产两种环境,不同环境使用不同配置文件,不同环境调用不同接口实现类。

3.3 多配置文件实现方式

(1) 定义工程

复制Spring Boot 快速入门中的工程,并重命名为 03-multiEnv。

(2) 定义配置文件

  • A、定义多个配置文件
    在 src/main/resources 中再定义两个配置文件,分别对应开发环境与生产环境。
    Spring Boot工程应用篇(二)多环境选择(相同代码运行在不同环境、不同环境执行不同实现类、单配置文件实现多环境)
    Spring Boot工程应用篇(二)多环境选择(相同代码运行在不同环境、不同环境执行不同实现类、单配置文件实现多环境)
    Spring Boot工程应用篇(二)多环境选择(相同代码运行在不同环境、不同环境执行不同实现类、单配置文件实现多环境)
    Spring Boot工程应用篇(二)多环境选择(相同代码运行在不同环境、不同环境执行不同实现类、单配置文件实现多环境)

  • B、 说明
    在 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 配置文件内容。

    在生产环境下,application.properties 中一般配置通用内容,并设置 spring.profiles.active 属性的值为 dev,即,直接指定要使用的配置文件为开发时的配置文件,而对于其它环境的选择,一般是通过命令行方式去**。配置文件 application-{profile}.properties 中则配置各个环境的不同内容。

(3) 定义业务代码
Spring Boot工程应用篇(二)多环境选择(相同代码运行在不同环境、不同环境执行不同实现类、单配置文件实现多环境)

  • A、定义业务接口
    Spring Boot工程应用篇(二)多环境选择(相同代码运行在不同环境、不同环境执行不同实现类、单配置文件实现多环境)

  • B、 定义两个实现类
    Spring Boot工程应用篇(二)多环境选择(相同代码运行在不同环境、不同环境执行不同实现类、单配置文件实现多环境)
    Spring Boot工程应用篇(二)多环境选择(相同代码运行在不同环境、不同环境执行不同实现类、单配置文件实现多环境)

  • C、 说明
    在实现类上添加@Profile 注解,并在注解参数中指定前述配置文件中的{profile}值,用于指定该实现类所适用的环境。

(4) 定义处理器
Spring Boot工程应用篇(二)多环境选择(相同代码运行在不同环境、不同环境执行不同实现类、单配置文件实现多环境)

(5) Idea 下运行与访问

  • A、运行
    打开主类在 Idea 中直接运行,即可在控制台看到默认使用的是开发环境,即端口号使用的是 8888,而工程的根路径为/ddd。
    Spring Boot工程应用篇(二)多环境选择(相同代码运行在不同环境、不同环境执行不同实现类、单配置文件实现多环境)

  • B、 访问
    Spring Boot工程应用篇(二)多环境选择(相同代码运行在不同环境、不同环境执行不同实现类、单配置文件实现多环境)
    从页面显示内容可知,其执行的业务接口实现类为 DevelopServiceImpl,即开发阶段应使用的实现类。

  • C、 修改配置文件
    Spring Boot工程应用篇(二)多环境选择(相同代码运行在不同环境、不同环境执行不同实现类、单配置文件实现多环境)

  • D、再运行
    将上次运行停掉后再次运行主类,即可在控制台看到使用的是生产环境,即端口号使用的是 9999,而工程的根路径为/ppp。
    Spring Boot工程应用篇(二)多环境选择(相同代码运行在不同环境、不同环境执行不同实现类、单配置文件实现多环境)

  • E、 再访问
    Spring Boot工程应用篇(二)多环境选择(相同代码运行在不同环境、不同环境执行不同实现类、单配置文件实现多环境)
    从页面显示内容可知,此次执行的业务接口实现类为 ProduceServiceImpl,即生产环境下应使用的实现类。

(6) 在命令行下选择环境

将工程打为 Jar 包后,在命令行运行。若要想切换运行环境,必须要修改主配置文件吗?答案是否定的。只需添加一个命令参数即可动态指定。

  • A、在命令行下运行 Jar 包
    例如,现在的主配置文件中指定的是 dev 环境。
    Spring Boot工程应用篇(二)多环境选择(相同代码运行在不同环境、不同环境执行不同实现类、单配置文件实现多环境)

    将当前工程打为 Jar 包后,在命令行运行时添加如下参数。
    Spring Boot工程应用篇(二)多环境选择(相同代码运行在不同环境、不同环境执行不同实现类、单配置文件实现多环境)

    此时执行的就是生产环境,调用的就是 ProduceServiceImpl 类。
    Spring Boot工程应用篇(二)多环境选择(相同代码运行在不同环境、不同环境执行不同实现类、单配置文件实现多环境)

  • B、 说明
    在命令行中添加的参数可以是写在配置文件中的任意属性。其原理是命令行设置的属性值的优选级高于配置文件的。

3.4 单配置文件实现方式

这种实现方式只能使用 application.yml 文件,使用 application.properties 文件好像文件本身就会出错。

(1) 定义工程

复制前面的 3-multiEnv 工程,并重命名为 03-multiEnv2。

(2) 修改配置文件

将原有的配置文件全部删除,然后定义 application.yml 文件。需要注意的是,这三部分之间是由三个减号(-)分隔的,必须是三个。而这三部分充当着之前的三个配置文件。
Spring Boot工程应用篇(二)多环境选择(相同代码运行在不同环境、不同环境执行不同实现类、单配置文件实现多环境)
(3) 运行与访问

运行与访问方式与前面的多配置文件的完全相同。