🏆本文收录于《Spring Boot从入门到精通》(https://luoyong.blog.csdn.net/article/details/131453171),专门攻坚指数提升,2023 年国内最系统+最强(更新中)。

本专栏致力打造最硬核Spring Boot 系列教程,从零基础到进阶系列学习内容,🚀均为全网独家首发,打造精品专栏,专栏持续更新中…欢迎大家订阅持续学习。

环境说明:Windows10 + Idea2021.3.2 + Jdk1.8 + SpringBoot 2.3.1.RELEASE

1. 前言

        随着企业IT应用架构越来越复杂,为了使应用开发和部署更加稳定、快速、可靠,常常需要把应用程序的配置文件和环境分离,其中的一个重要方案就是多环境配置。在多环境配置中,不同的环境可以定义不同的参数,比如数据库连接、日志输出等等。Spring Boot自带了多环境配置的支持,本文将介绍如何轻松实现开发、测试、生产环境切换。

2. 摘要

        本文将采用Spring Boot的多环境配置,实现应用程序在不同环境下的部署。首先,我们将创建一个Spring Boot应用程序,并定义三个不同的配置文件:application-dev.properties、application-test.properties和application-prod.properties,分别对应开发、测试和生产环境。然后,我们将演示如何在应用程序中通过注入Environment对象来获取配置信息,以及如何在maven中通过profiles来实现环境的切换。

3. 正文

3.1 创建Spring Boot应用程序

        首先,我们需要创建一个Spring Boot应用程序,可以在Spring官网上下载最新版本的Spring Boot框架。在创建应用程序时,需要选择Spring Initializr,然后填写项目基本信息,比如Group、Artifact、Dependencies等等。在本文中,我们选择Web和JPA作为应用程序的依赖,如下所示:

项目整体结构截图演示:

Spring Boot多环境配置,如何轻松实现开发、测试、生产环境切换?_spring

3.2 定义配置文件

        在应用程序的src/main/resources目录下,我们可以定义应用程序的配置文件。Spring Boot提供了多种配置文件格式,包括.properties、.yaml、.json等等。在本文中,我们选择.properties格式来作为应用程序的配置文件。

        在创建应用程序时,可以与原有的application.properties文件合并,也可以单独创建application-dev.properties、application-test.properties和application-prod.properties文件来分别对应不同的环境。在每个文件中,我们可以定义不同的配置参数,比如数据库连接、日志输出等等。下面是一个示例:

application-dev.properties:

spring.datasource.url=jdbc:mysql://localhost:3306/dev
spring.datasource.username=root
spring.datasource.password=root
logging.level.org.springframework.web=DEBUG

application-test.properties:

spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=root
logging.level.org.springframework.web=INFO

application-prod.properties:

spring.datasource.url=jdbc:mysql://localhost:3306/prod
spring.datasource.username=root
spring.datasource.password=root
logging.level.org.springframework.web=ERROR

示例截图如下:

Spring Boot多环境配置,如何轻松实现开发、测试、生产环境切换?_spring_02

在以上配置文件中,我们分别定义了不同的数据库连接和日志输出级别。在不同的环境下,这些参数可以不同,从而使得应用程序能够灵活地适应不同的环境。

3.3 获取配置信息

        在应用程序中,我们可以通过注入Environment对象来获取不同环境下的配置信息。Environment对象是Spring Boot提供的一个核心组件,可以帮助我们轻松获取应用程序的配置信息。下面是一个简单的示例:

@RestController
public class ExampleController {

    @Autowired
    private Environment env;

    @GetMapping("/config")
    public String getConfig() {
        String url = env.getProperty("spring.datasource.url");
        String username = env.getProperty("spring.datasource.username");
        String password = env.getProperty("spring.datasource.password");
        return "URL=" + url + ", Username=" + username + ", Password=" + password;
    }
}

        在以上示例中,我们定义了一个RestController,通过注入Environment对象来获取数据库连接参数。在应用程序中,我们可以通过调用env.getProperty(String key)方法来获取不同环境下的配置信息。同时,我们也可以使用@Value注解来获取配置参数,如下所示:

@Value("${spring.datasource.url}")
private String url;

@Value("${spring.datasource.username}")
private String username;

@Value("${spring.datasource.password}")
private String password;

Spring Boot多环境配置,如何轻松实现开发、测试、生产环境切换?_spring_03

3.4 切换环境

        在使用Spring Boot的多环境配置时,我们常常需要在不同的环境下进行切换。Spring Boot提供了多种方法来实现环境的切换,其中最常用的是使用maven的profiles。

        在pom.xml文件中,我们可以定义不同的profiles,比如dev、test和prod。在不同的profiles中,我们可以定义不同的依赖、插件、配置等等。下面是一个简单的示例:

<profiles>
    <profile>
        <id>dev</id>
        <properties>
            <activatedProperties>dev</activatedProperties>
        </properties>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
    </profile>
    <profile>
        <id>test</id>
        <properties>
            <activatedProperties>test</activatedProperties>
        </properties>
    </profile>
    <profile>
        <id>prod</id>
        <properties>
            <activatedProperties>prod</activatedProperties>
        </properties>
    </profile>
</profiles>

<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
        </resource>
    </resources>
</build>


在以上示例中,我们定义了三个不同的profiles,分别对应开发、测试和生产环境。在每个profiles中,我们通过activatedProperties属性来指定应用程序使用的配置文件。同时,在build节点中,我们还需要添加一个resource节点来指定对应的配置文件目录,并设置filtering为true,以便通过maven的profiles来切换环境。

示例截图如下:

4. 测试用例

        为保证代码质量和可靠性,我们需要编写测试用例来验证应用程序的正确性。下面是一个简单的测试用例:

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class ExampleControllerTest {

    @Autowired
    private TestRestTemplate restTemplate;

    @Value("${local.server.port}")
    private int port;

    @Test
    public void getConfig() {
        ResponseEntity<String> response = restTemplate.getForEntity("http://localhost:" + port + "/config", String.class);
        assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK);
        assertThat(response.getBody()).isEqualTo("URL=jdbc:mysql://localhost:3306/dev, Username=root, Password=root");
    }
}

小结

        Spring Boot的多环境配置是一个非常重要的技术,可以帮助我们轻松实现应用程序的开发、测试、生产环境切换。通过本文的介绍,我们可以学习到如何为应用程序定义多个不同的配置文件,并通过注入Environment对象来获取配置信息。此外,我们还可以通过maven的profiles来实现不同环境间的切换,使得应用程序的部署更加灵活。

关于我

👨🎓作者:bug菌
✏️博客:CSDN、掘金infoQ51CTO
🎉简介:CSDN|阿里云|华为云|51CTO等社区博客专家,历届博客之星Top30,掘金年度人气作者Top40,51CTO年度博主Top12,掘金 | InfoQ | 51CTO等社区优质创作者,全网粉丝合计15w+ ;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板等海量资料.