什么是Spring Profiles以及如何使用

[版权申明] 非商业目的注明出处可自由转载
出自:shusheng007

概述

在你刚接触SpringBoot的时候有没有对它提供的Profile有些许不适应,经过摸索后才领悟到它的强大。今天我就对Profile进行一点归纳总结,留作互联网记忆。

Profile是什么

Profile翻译成中国话就是:简介,档案… 。例如王二狗和牛翠花两人各有一套自己的profile

翠花的Profile:

姓名:牛翠花
性别:女
爱好:逛街

王二狗的Profile:

姓名:王二狗
性别:男
爱好:编程,看美女

对应到Spring中也是一样的。在实际开发中会同时存在dev、uat、prod等多套环境,这些环境共用一套代码逻辑,但却需要不同的配置。例如dev环境要连接测试数据库,而prod则需要连接生产数据库等等。

如何使用

前面已经说了,profile最主要的目的就是可以区分不同的环境,进而对不同环境进行配置。那么如何使用呢,在SpringBoot中有两种使用方式。

配置文件

SpringBoot中通过对application.properties/application.yaml配置文件的命名规则进行约定,然后依据当前激活的profile来加载相应的配置文件。

application-{你的profile}.properties/application-{你的profile}.yaml

下面是当前demo项目结构,可见在resources文件夹下存在3个配置文件:

├── src
│   ├── main
│   │   ├── java
│   │   └── resources
│   │       ├── application-dev.yaml
│   │       ├── application-prod.yaml
│   │       ├── application.yaml

application-dev.yaml

server:
  port: 8081

application-prod.yaml

server:
  port: 8082

application.yaml

#空白

当profile为default时,只使用application.yaml,SpringBoot默认Server端口为8080。将当前profile激活为dev时, SpringBoot就会额外加载application-dev.yaml 后合并到application.yaml中,若其中有相同的配置则覆盖掉。

下面是不激活profile时启动项目时的输出,可以看到profile为default,server的port为8080

2021-09-22 22:55:31.505  INFO 78078 --- [  restartedMain] t.s.s.SpringProfilesApplication  : No active profile set, falling back to default profiles: default
...
2021-09-22 22:55:33.056  INFO 78078 --- [  restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)

代码配置

通过配置文件使用profile最为常用,除此之外,Spring还提供了一个@Profile注解,通过它可以通过代码的方式使用profile。

假设我们有一个接口

public interface Speaker {
    String speak();
}

我需要在不同的环境中使用不同的bean,在dev环境中使用如下bean

@Service
@Profile(value = {"dev","default"})
public class DevSpeaker implements Speaker{
    @Override
    public String speak() {
        return "I am dev speaker";
    }
}

在prod环境中使用如下bean

@Service
@Profile("prod")
public class ProdSpeaker implements Speaker{
    @Override
    public String speak() {
        return "I am prod speaker";
    }
}

注意这两个文件的注解@Profile

在使用的地方直接注入接口的实例即可

@RestController
public class SpeakerController {
    private final Speaker speaker;

    public SpeakerController(Speaker speaker) {
        this.speaker = speaker;
    }

    @RequestMapping(method = RequestMethod.GET,path = "/speak")
    public String speaking(){
       return speaker.speak();
    }
}

如何激活

上面讲的都是如何使用,但是我们如何将我们当前的profile切换到dev/prod等profile呢?SpringBoot支持非常多种方式,我们简单介绍几种简单而常用的方式。

使用启动参数

我们可以在SpringBoot项目启动时传入参数,这种参数分3种,这里使用任意一种就可以。

如果我们使用Intellij IDEA的话,可以点击Edit Configuration,然后打开Configurations配置框,在下面蓝色框中,任意选择一个填入即可。
在这里插入图片描述

使用application配置文件

可以将profile配置到项目的application 文件中

spring:
  profiles:
    active: dev

使用maven的profile

maven本身也支持profile,用来控制编译打包等流程。SpringBoot的application文件可以读取pom.xml中定义的profile,从而激活相应的profile。

  • pom.xml 文件中添加profiles
<project ...>
   ...
    <profiles>
        <profile>
            <id>dev</id>
            <properties>
                <evn>dev</evn>
            </properties>
        </profile>
        <profile>
            <id>prod</id>
            <properties>
                <evn>prod</evn>
            </properties>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
        </profile>
    </profiles>
    ...
 </project>

我们建立了dev和prod两个profile,然后将prod作为默认执行的profile。添加完后刷新maven,可以看到IDE右上角maven的窗口出现了一个Profiles的条目。我们可以勾选激活哪一个profile,记得reload。

在这里插入图片描述

  • application.yaml中读取
spring:
  profiles:
    active: @evn@

注意@evn@,其中evn是我们在pom.xml 中的profiles定义的<evn>你的profile</evn>,而前后两个@是SpringBoot 读取maven的profile的语法。

正常情况下经过以上两步就OK了,我测试的时候也只需要上面两步就成功了,但是有人反映需要添加如下配置。

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

如何获取激活的Profiles

有两种方法获取当前激活的profile,通过Environment 或者@Value

@RestController
public class SpeakerController {
    @Value("${spring.profiles.active:}")
    private String activeProfile;
    
    private final Environment environment;
    
    public SpeakerController(Environment environment) {
        this.environment = environment;
    }

    @GetMapping("/profiles")
    public String getCurrentProfiles(){
       return String.format("通过Environment获取:%s | 通过@Value获取:%s",
               Arrays.toString(environment.getActiveProfiles()),
               activeProfile);
    }
}

总结

暂时就说这么多吧,有什么问题留言,没有问题就点赞,睡觉去咯。。。

文章首发及源码地址

  • 26
    点赞
  • 63
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
### 回答1: 要更改活动的 Spring 配置文件,可以使用以下几种方法之一: 1. 在启动应用程序时使用命令行参数 --spring.profiles.active=profile1,profile2 2. 在 application.properties 或 application.yml 中设置 spring.profiles.active 属性 3. 通过编程方式设置环境变量,例如:`System.setProperty("spring.profiles.active", "profile1,profile2")` ### 回答2: active spring profiles是Spring框架中的一项核心功能,它允许我们在不同的环境下使用不同的配置文件,以满足不同的需求。 当我们需要切换不同的环境时,我们可以通过改变active spring profiles来实现。在Spring Boot应用程序中,active spring profiles可以通过不同的方式来配置,包括在application.properties或application.yml文件中设置spring.profiles.active属性,或者在命令行中使用-Dspring.profiles.active选项来设置。 改变active spring profiles的过程中,Spring框架会根据当前设置的profile来加载不同的配置文件,从而实现应用程序的不同配置。例如,我们可以在开发环境和生产环境中使用不同的数据库连接参数、日志级别、缓存配置等等。 在实际应用开发中,我们经常需要对应用进行调试、测试和部署,这时就需要使用不同的环境配置文件。通过改变active spring profiles,我们可以方便地实现不同环境间的切换,从而确保应用程序在不同的环境中都能正常工作。同时,我们也可以通过使用Spring Profile来实现类似AOP的功能,例如只在特定的配置文件中启用某些功能,或者只在特定的环境中加载某些模块。 总之,active spring profiles是Spring框架中非常重要的一个功能,它提供了一种方便、灵活、可定制的方式来管理应用程序的配置,大大简化了不同环境下的开发、测试和部署工作。 ### 回答3: 在基于Spring框架开发的应用程序中,Spring Profile是一种用于控制bean定义的方式。Bean定义是在XML文件或Java类中指定的,Profile可以使配置简单,让您的应用程序更易于扩展和维护。 Spring框架支持三种类型的Profiles:默认Profile , 环境Profile,和激活Profile。在本文中,我们将讨论如何更改Active Spring Profiles。 默认情况下,Spring应用程序的Profile为default。Default Profile通常指定了开发环境。但如果你需要不同的environment,例如test或production,你需要更改Active Spring Profiles。 更改Active Spring Profiles有几种方法: 一、使用JVM参数。可以在JVM参数中设置Active Spring Profiles。例如,如果您要设置Profile为test,您可以使用以下命令启动JVM: java -jar myapp.jar --spring.profiles.active=test 二、使用环境变量。您可以设置环境变量来指定Active Spring Profiles。例如,您可以设置以下环境变量: export SPRING_PROFILES_ACTIVE=test 三、使用编程方式。您可以通过编写Java代码来设置Active Spring Profiles。例如,您可以在应用程序的入口点中添加以下代码: ConfigurableApplicationContext ctx = new AnnotationConfigApplicationContext(); ctx.getEnvironment().setActiveProfiles("test"); ctx.scan("my.package"); ctx.refresh(); 无论您选择哪种方法,您都可以轻松地更改Active Spring Profiles,以便更好地控制应用程序的行为。通过使用不同的Profile,您可以轻松地切换到不同的环境,例如开发、测试和生产环境等,而无需重新编写代码或配置文件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ShuSheng007

亲爱的猿猿,难道你又要白嫖?

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值