深入浅出 Spring Boot 多种设定档管里(Spring Profiles)

在任何开发框架中,多环境管理通常是重要的核心功能,在 Spring 框架中也不例外,这里称为我们的Spring Profiles设置文件的功能说起来很简单,但实现起来却是一个功能。小心乱掉掉的文章我很愿意来讨论一番,很容易把话题搞清楚才不会管得了。

image.png

建立实例应用程序

  1. 使用 Spring Boot CLI 快速创建专案(也可以使用Spring Initializr建立)

    <pre class="hljs lua" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 0.75em; font-size: 14px; line-height: 1.5em; word-break: break-all; word-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;">spring init --dependencies=web --groupId=com.duotify sbprofile1</pre>

    使用 Visual Studio Code 开启该专案

    <pre class="hljs nginx" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 0.75em; font-size: 14px; line-height: 1.5em; word-break: break-all; word-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;">代码sbprofile1</pre>

  2. 加入一个HomeController技术

    档名路径:src/main/java/com/duotify/sbprofile1/controllers/HomeController.java

    <pre class="prettyprint hljs css" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 1.5em; font-size: 14px; line-height: 1.5em; word-break: break-all; word-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;">包 com .duotify .sbprofile1 .controllers;

    导入 org .springframework .web .bind .annotation .GetMapping; 导入 org .springframework .web .bind .annotation .RestController;
    @休息控制器 公共类 HomeController { @GetMapping ( "/") 公共字符串主页(){
    返回“你好 世界”; } }</pre>

  3. 测试执行

    <pre class="hljs dockerfile" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 0.75em; font-size: 14px; line-height: 1.5em; word-break: break-all; word-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;">mvn clean spring-boot:运行</pre>

    补充说明:你可以在pom.xml<build>底下添加一个设置<defaultGoal>spring-boot:run</defaultGoal>,未来只要打就可以mvn自动启动 Spring Boot 执行喔!:+1:

    使用 cURL 测试

    <pre class="hljs ruby" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 0.75em; font-size: 14px; line-height: 1.5em; word-break: break-all; word-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;">$ curl本地主机:8080 Hello World</pre>

理解设定档(Profiles)的真正含意

春天的框架有一大堆抽象的概念,不好好花时间研究,会有很多恶魔般的细节无法理解。本文所提到的春天简介原本是一个很简单的概念,但是在写春天靴子的时候却是那样的有很多变化,可以让你脑袋打结什么。

我们先从最简单、最抽象的概念开始讲起。

配置文件(配置文件)常用这个名字( Profile Name),名字代表应用程序配置。你可以通过一个简单的设置名称(Profile Name),快速的切换应用程序配置,就这么简单!

其中应用程序配置包含了两层含意:

  1. 未配置(Configuration)

    那个配置其实就是像这样的src/main/resources/application.properties属性定义档。

  2. 应用程序组件组合(组件组合)

    应用程序组件组件组合使用的程序里面有****哪些「」要启用,你就可以在应用程序执行期间通过本次启动的参数,简单地决定使用什么配置文件来执行应用程序启动。

使用Profile来管里应用配置,最常见的例子,就是用在「多环境」部署上,比如你有公司内部的「测试环境」与客户提供的「正式环境」,通常有哪些设定都一样,但也有一样的地方。此时我们就可以通过多个Profile中的这些差异,分别来管理之后,我们只要知道设置名称(Profile Name)就可以切换不同的环境。

如何使用应用程序属性(Application Properties)

在了解如何管里多个设置文件之前,应该先了解应用程序属性(Application Properties)应该怎么用。

的体验步骤如下:

  1. 编辑src/main/resources/application.properties属性档

    加入一个my.profile属性值

    <pre class="hljs vim" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 0.75em; font-size: 14px; line-height: 1.5em; word-break: break-all; word-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;">我的。个人资料=dev</pre>

  2. 调整HomeController,添加一个私有字段(Private Field),并@Value通过添加来一个my.profile属性值

    档名路径:src/main/java/com/duotify/sbprofile1/controllers/HomeController.java

    <pre class="prettyprint hljs css" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 1.5em; font-size: 14px; line-height: 1.5em; word-break: break-all; word-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;">包 com .duotify .sbprofile1 .controllers;

    导入 org .springframework .beans .factory .annotation .Value; 导入 org .springframework .web .bind .annotation .GetMapping; 导入 org .springframework .web .bind .annotation .RestController;
    @休息控制器 公共类 HomeController {
    @Value ( "${ my .profile }") private String myProfile ;
    @GetMapping ( "/") 公共字符串主页(){
    返回“你好 世界:”+这个.myProfile; } }</pre>

  3. 测试执行

    <pre class="hljs dockerfile" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 0.75em; font-size: 14px; line-height: 1.5em; word-break: break-all; word-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;">mvn clean spring-boot:运行</pre>

    使用 cURL 测试

    <pre class="hljs groovy" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 0.75em; font-size: 14px; line-height: 1.5em; word-break: break-all; word-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;">$ curl本地主机:8080 Hello World:开发</pre>

环境参数、环境变量如何变化、环境变量如何变化

当通过穿透属性的时候,加入属性,此时 Maven 需要一个pom.xml定义方法,我们希望将某个属性的值写入到“src/main/resources/application.properties属性文件中”。

的体验步骤如下:

  1. 编辑src/main/resources/application.properties属性档

    加入一个my.profile属性值

    <pre class="hljs kotlin" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 0.75em; font-size: 14px; line-height: 1.5em; word-break: break-all; word-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;">我的.profile= @我的。轮廓@</pre>

  2. 调整pom.xml档,在<properties>加入一个<my.profile>属性

    <pre class="hljs xml" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 0.75em; font-size: 14px; line-height: 1.5em; word-break: break-all; word-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;">< my.profile > dev2 </ my.profile ></pre>

  3. 测试执行

    <pre class="hljs dockerfile" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 0.75em; font-size: 14px; line-height: 1.5em; word-break: break-all; word-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;">mvn clean spring-boot:运行</pre>

    使用 cURL 测试

    <pre class="hljs groovy" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 0.75em; font-size: 14px; line-height: 1.5em; word-break: break-all; word-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;">$ curl本地主机:8080 Hello World: dev2</pre>

我们在特殊情况下,他会定义一个特殊的属性值,在特殊情况下,他会定义一个特殊的属性值,如果在编译时,Maven 会在编译时加入application.properties默认,那是可以让你在执行期间才通过方法优点(赋值)。@my.profile@

  • 直接从命令列参数参数

    <pre class="hljs vim" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 0.75em; font-size: 14px; line-height: 1.5em; word-break: break-all; word-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;">mvn clean spring- boot t:run -Dmy. 配置文件=dev3</pre>

    <pre class="hljs groovy" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 0.75em; font-size: 14px; line-height: 1.5em; word-break: break-all; word-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;">$ curl本地主机:8080 Hello World: dev3</pre>

  • 直接值从环境变化数字属性

    下面是 Bash 设定环境变数的语法:

    <pre class="hljs ini" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 0.75em; font-size: 14px; line-height: 1.5em; word-break: break-all; word-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;">my_profile =dev4 mvn clean spring-boot:run</pre>

    <pre class="hljs groovy" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 0.75em; font-size: 14px; line-height: 1.5em; word-break: break-all; word-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;">$ curl本地主机:8080 Hello World: dev4</pre>

    环境变数发生属性名称有小数点(.)的时候,记得转成底线(_)才可以。

  • 先有档次,通过调用参数java -jar时也可以使用

    <pre class="hljs lua" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 0.75em; font-size: 14px; line-height: 1.5em; word-break: break-all; word-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;">mvn 清洁包</pre>

    <pre class="hljs nginx" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 0.75em; font-size: 14px; line-height: 1.5em; word-break: break-all; word-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;">java -Dmy.profile=dev5 -jar 目标/ sbprofile1-0。0 . 1 -SNAPSHOT.jar</pre>

    这个-Dmy.profile=dev5参数会使用JVM当系统参数。

    <pre class="hljs groovy" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 0.75em; font-size: 14px; line-height: 1.5em; word-break: break-all; word-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;">$ curl本地主机:8080 Hello World: dev5</pre>

    请记住-Dmy.profile=dev5一定要设置在-jar前面!

  • 先决条件,通过环境变量java -jar时也可以通过

    <pre class="hljs lua" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 0.75em; font-size: 14px; line-height: 1.5em; word-break: break-all; word-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;">mvn 清洁包</pre>

    <pre class="hljs ini" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 0.75em; font-size: 14px; line-height: 1.5em; word-break: break-all; word-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;">my_profile =dev6 java -jar 目标/sbprofile1- 0.0。1 -SNAPSHOT.jar</pre>

    <pre class="hljs groovy" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 0.75em; font-size: 14px; line-height: 1.5em; word-break: break-all; word-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;">$ curl本地主机:8080 Hello World: dev6</pre>

    请记住-Dmy.profile=dev5一定要设置在-jar前面!

  • 直接从.env定义的环境变量

    先在专案根目录加入一个.env档,内容如下:

    <pre class="hljs ini" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 0.75em; font-size: 14px; line-height: 1.5em; word-break: break-all; word-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;">我的个人资料 = dev7</pre>

    建立一个启动设置档( VSCode .vscode/launch.json

    <pre class="prettyprint hljs json" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 1.5em; font-size: 14px; line-height: 1.5em; word-break: break-all; word-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;">{ “版本”:“0.2.0”, “配置”:[ {
    “type”:“java”, “name”:“Launch DemoApplication”, “request”:“launch”, “mainClass”:“com.duotify.sbprofile1.DemoApplication”, “projectName”:“sbprofile1”, “envFile” : "${workspaceFolder}/.env" } ] }</pre>

    这里的重点envFile设定。

    点击F5启动专案,就可以读取到设定值了!

    <pre class="hljs groovy" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 0.75em; font-size: 14px; line-height: 1.5em; word-break: break-all; word-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;">$ curl本地主机:8080 Hello World: dev7</pre>

理解 Spring Profiles 设置文件的使用方式

在了解了 Properties 文件的使用与设置文件之后,终于可以进入到这里的重点内容,那是如何定义 Spring Profiles 文件的。

下面是体验步骤:

  1. 编辑src/main/resources/application.properties属性档

    加入一个spring.profiles.active属性值

    <pre class="hljs kotlin" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 0.75em; font-size: 14px; line-height: 1.5em; word-break: break-all; word-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;">spring.profiles.active=@spring .profiles。积极的@</pre>

    这里将spring.profiles.active使用框架会使用的属性是 Spring 的一个名称,而正确的一个名称@spring.profiles.active@可以来自外部的属性。

  2. pom.xml调整的设定档,加入Maven的<profiles>设定

    <pre class="prettyprint hljs xml" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 1.5em; font-size: 14px; line-height: 1.5em; word-break: break-all; word-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;">< profiles >
    < profile >
    < id >默认</ id >
    < activation >
    < activeByDefault > true </ activeByDefault >
    </ activation >
    < properties >
    < spring.profiles.active > default < /spring.profiles.active >
    </属性>
    </ profile >
    < profile >
    < id >开发8 </id >
    <属性>
    < spring.profiles.active > dev8 < /spring.profiles.active >
    </ properties >
    </ profile >
    </ profiles ></pre>

    属性比较不同的地方可以定义一个文件的属性,我们定义一个我们不同2的配置文件。 ,这个属性是用来给 Spring 应用程序参考当前启用设置文件是谁。default``dev8``spring.profiles.active

    请记住:你在pom.xml定义的属性(<properties>)并且不会直接给 Java 程序参考,它们之间的关系是:

    <pre class="prettyprint hljs elm" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 1.5em; font-size: 14px; line-height: 1.5em; word-break: break-all; word-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;">Java文件原始文件属性/应用程序文件属性/ml) <-- 属性属性外部属性。</pre>

  3. 修改HomeController@Value标注,改注spring.profiles.active属性

    <pre class="prettyprint hljs css" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 1.5em; font-size: 14px; line-height: 1.5em; word-break: break-all; word-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;">包 com .duotify .sbprofile1 .controllers;

    导入 org .springframework .beans .factory .annotation .Value; 导入 org .springframework .web .bind .annotation .GetMapping; 导入 org .springframework .web .bind .annotation .RestController;
    @休息控制器 公共类 HomeController {
    @Value ( "${ spring .profiles .active }") private String myProfile ;
    @GetMapping ( "/") 公共字符串主页(){
    返回“你好 世界:”+这个.myProfile; } }</pre>

  4. 测试执行

    请记住我们现在有两个设置档,分别是default和这两个设置档dev8。当我们用mvn spring-boot:run启动应用程序的时候,就可以用-P外加一个ProfileName就可以启用设置档了。

    <pre class="hljs dockerfile" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 0.75em; font-size: 14px; line-height: 1.5em; word-break: break-all; word-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;">mvn clean spring-boot:运行-Pdev8</pre>

    注意:这里的-P必须P接上一个元素的大值写,而且后面的名称是pom.xml表格<id>

    使用 cURL 测试

    <pre class="hljs groovy" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 0.75em; font-size: 14px; line-height: 1.5em; word-break: break-all; word-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;">$ curl本地主机:8080 Hello World: dev8</pre>

    尝试设定一个名称:不存在的 dev9设定档是你自己的预设

    <pre class="hljs dockerfile" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 0.75em; font-size: 14px; line-height: 1.5em; word-break: break-all; word-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;">mvn clean spring-boot:运行-Pdev9</pre>

    <pre class="hljs groovy" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 0.75em; font-size: 14px; line-height: 1.5em; word-break: break-all; word-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;">$ curl localhost:8080 Hello World: 默认</pre>

注意:是可以的,-P可以用两个图标来启用。例如,您可以启用以下命令来测试mvn help:active-profiles -Pdev,prod

通过 Spring Profiles 切换不同的应用程序属性文件

使用 Spring 框架的 Profiles 功能,还有另外一个好处,那是你可以不用把属性设置在 Maven 的pom.xml文件里面,可以通过自定义的习惯,将应用程序设置在不同的文件.properties中。以下文件名称规格请见注解说明:

<pre class="prettyprint hljs makefile" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 1.5em; font-size: 14px; line-height: 1.5em; word-break: break-all; word-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"># 这是预设的这个应用程序属性档,无论启用哪个设置,载入档案中的属性 应用程序属性

这是特定设置文件会套用的应用程序文件,只有启用的属性文件会载入文件中的属性 application-{ProfileName}.properties</pre>

请注意:在application文件名后面要接上-(破折号)符号,然后接上你的ProfileName正确的命名规则。

就来一下多设置文件我们的套用体验情况

  1. 我们再加入一个dev9设定档到pom.xml档中

    <pre class="prettyprint hljs xml" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 1.5em; font-size: 14px; line-height: 1.5em; word-break: break-all; word-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;">< profiles >
    < profile >
    < id >默认</ id >
    < activation >
    < activeByDefault > true </ activeByDefault >
    </ activation >
    < properties >
    < spring.profiles.active > default < /spring.profiles.active >
    </属性>
    </ profile >
    < profile >
    < id >开发8 </id >
    < properties >
    < spring.profiles.active > dev8 < /spring.profiles.active >
    </ properties >
    </ profile >
    < profile >
    < id > dev9 </ id >
    < properties >
    < spring.profiles.active > dev9 < /spring.profiles.active >
    </ properties >
    </ profile >
    </ profiles ></pre>

  2. 除了application.properties,我们另外建立两个应用程序属性文件

    档案1:(src/main/resources/application.properties加入一个my.name属性)

    <pre class="prettyprint hljs kotlin" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 1.5em; font-size: 14px; line-height: 1.5em; word-break: break-all; word-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;">我的.profile= @我的。profile@ spring.profiles.active= @ spring.profiles。active@my.name=Will _</pre>

    档案2:(src/main/resources/application-dev8.properties加入一个my.name属性)

    <pre class="hljs delphi" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 0.75em; font-size: 14px; line-height: 1.5em; word-break: break-all; word-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;">我的。名字=约翰</pre>

    档案3:(src/main/resources/application-dev9.properties空白内容)

  3. 修改HomeController@Value标注,改注spring.profiles.active属性

    <pre class="prettyprint hljs kotlin" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 1.5em; font-size: 14px; line-height: 1.5em; word-break: break-all; word-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;">包com.duotify.sbprofile1.controllers;

    导入org.springframework.beans.factory。注释.Value; 导入org.springframework.web.bind。注释.GetMapping; 导入org.springframework.web.bind。注释.RestController;

    @RestController
    公共 类 HomeController {

    @Value( " ${spring.profiles.active} " )
    私有字符串 myProfile;
    
    @Value( " ${my.name} " )
    私有字符串 myName;
    
    @GetMapping( "/" ) 
    public String home() { return  "Hello World:" + this .myName; } }</pre>
    
  4. 测试执行

    请记住我们现在的三个3设定档,分别是defaultdev8dev9这。

    先尝试不指定个人资料的情况

    <pre class="hljs dockerfile" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 0.75em; font-size: 14px; line-height: 1.5em; word-break: break-all; word-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;">mvn clean spring-boot:运行</pre>

    <pre class="hljs groovy" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 0.75em; font-size: 14px; line-height: 1.5em; word-break: break-all; word-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;">$ curl localhost: 8080 Hello World:将</pre>

    重新尝试指定个人资料dev8的情况

    <pre class="hljs dockerfile" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 0.75em; font-size: 14px; line-height: 1.5em; word-break: break-all; word-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;">mvn clean spring-boot:运行-Pdev8</pre>

    <pre class="hljs groovy" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 0.75em; font-size: 14px; line-height: 1.5em; word-break: break-all; word-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;">$ curl localhost:8080 Hello World:约翰</pre>

    最后尝试指定个人资料dev9的情况

    <pre class="hljs dockerfile" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 0.75em; font-size: 14px; line-height: 1.5em; word-break: break-all; word-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;">mvn clean spring-boot:运行-Pdev9</pre>

    <pre class="hljs groovy" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 0.75em; font-size: 14px; line-height: 1.5em; word-break: break-all; word-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;">$ curl localhost: 8080 Hello World:将</pre>

透过 Spring Profiles 载入不同的相依套件

通过例如 Spring Profile 的不同设置方式进行设置,除了可以设置“属性”之外,重新设置(Profile)来加载的相依套件<dependencies>与不同的****版本(测试新旧版本)相同版本),不同的介面资料面但不同(不同模式库驱动)之类的,这点不同的套件很赞!:+1:

  • 下面是不同版本的不同设置示例:

    <pre class="prettyprint hljs xml" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 1.5em; font-size: 14px; line-height: 1.5em; word-break: break-all; word-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;">< profile >
    < id > dev8 </ id >
    < dependencies >
    < dependency >
    < groupId > org.springframework.boot </ groupId >
    < artifactId > spring-boot-starter-web </ artifactId >
    < version > 2.7.0 < /版本>
    </依赖>
    </依赖>
    <属性>
    < spring.profile.active> dev8 < /spring.profiles.active >
    </属性>
    </ profile ></pre>

    如果想看套用不同的 Profile 之后的相依套件,可以执行以下命令:

    <pre class="hljs nginx" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 0.75em; font-size: 14px; line-height: 1.5em; word-break: break-all; word-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;">mvn依赖:tree -Pdev8</pre>

  • 下面是不同介面不同套件的设定示例:

    <pre class="prettyprint hljs xml" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 1.5em; font-size: 14px; line-height: 1.5em; word-break: break-all; word-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;">< profiles >
    < profile >
    < id >本地</ id >
    < dependencies >
    < dependency >
    < groupId > org.hsqldb </ groupId >
    < artifactId > hsqldb </ artifactId >
    < version > 2.3.3 </ version >
    < classifier > jdk5 </分类器>
    </依赖>
    </依赖项>
    <属性>
    < jdbc.url > jdbc:hsqldb:file:databaseName < /jdbc.url >
    < jdbc.username > a < /jdbc.username >
    < jdbc.password > </ jdbc.password >
    < jdbc.driver > org.hsqldb.jdbcDriver </ jdbc.driver >
    </ properties >
    </ profile >
    < profile >
    < id > MySQL </身份证>
    < dependencies >
    < dependency >
    < groupId > mysql </ groupId >
    < artifactId > mysql-connector-java </ artifactId >
    < version > 5.1.38 </ version >
    </ dependency >
    </ dependencies >
    < properties >
    < jdbc. url > jdbc:mysql://mysql.website.ac.uk:3306 </ jdbc.url >
    < jdbc.username >用户< /jdbc.username >
    < jdbc.password > 1234 < /jdbc.password >
    < jdbc.driver > com.mysql.jdbc.Driver < /jdbc.driver >
    </ properties >
    </ profile >
    </ profiles ></pre>

透过 Spring Profiles 载入不同 Beans

在春天的框架下,所有用@Component标注的这些类别全部都被注册成豆类元素,其中当然也包含@Configuration标注的类别,因为标注都继承自@Component介面。

然而,你只要在上面额外@Profile套上类别的标签,就可以很简单地宣布春天要在特定的个人资料下载入,以下是使用示例:

  1. 建立一个UserService类别

    <pre class="prettyprint hljs kotlin" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 1.5em; font-size: 14px; line-height: 1.5em; word-break: break-all; word-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;">包com.duotify.sbprofile1.services;

    公共 类 UserService { public UserService(String name) { this .name = name; }
    私有字符串名称; public String getName() { 返回名称; } }</pre>

  2. 建立一个UserServiceDev类别

    <pre class="prettyprint hljs css" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 1.5em; font-size: 14px; line-height: 1.5em; word-break: break-all; word-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;">包 com .duotify .sbprofile1 .services;

    导入 org .springframework .context .annotation .Bean; 导入org .springframework .context .annotation .Profile; 导入org .springframework .stereotype .Component;
    @组件 @Profile( "dev" ) 公共类 UserServiceDev { @豆 公共用户服务 getUserService() {
    返回 新的 用户服务(“开发”); } }</pre>

    这个UserServiceDev只有在dev启用设置档时才会被Spring执行。

  3. 建立一个UserServiceProd类别

    <pre class="prettyprint hljs css" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 1.5em; font-size: 14px; line-height: 1.5em; word-break: break-all; word-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;">包 com .duotify .sbprofile1 .services;

    导入 org .springframework .context .annotation .Bean; 导入org .springframework .context .annotation .Profile; 导入org .springframework .stereotype .Component;
    @组件 @Profile( "!dev" ) 公共类 UserServiceProd { @豆 公共用户服务 getUserService() {
    返回 新的 用户服务(“产品”); } }</pre>

    这个只有在启用UserServiceDevdev设置档时才会被 Spring 执行。

  4. 修改HomeController并通过「式」注入UserService服务

    <pre class="prettyprint hljs kotlin" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 1.5em; font-size: 14px; line-height: 1.5em; word-break: break-all; word-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;">包com.duotify.sbprofile1.controllers;

    导入org.springframework.beans.factory。注释.Value; 导入org.springframework.web.bind。注释.GetMapping; 导入org.springframework.web.bind。注释.RestController;

    导入com.duotify.sbprofile1.services.UserService;

    @RestController
    公共 类 HomeController {

    @Value( " ${spring.profiles.active} " )
    私有字符串 myProfile;
    
    @Value( " ${my.name} " )
    私有字符串 myName;
    
    私人用户服务 svc;
    
    公共HomeController(UserService svc) { 这个.svc = svc; }
    
    @GetMapping( "/" ) 
    public String home() { return  "Hello World:" + this .svc.getName(); } }</pre>
    
  5. 修改pom.xml再加入两个<profile>定义

    <pre class="prettyprint hljs xml" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 1.5em; font-size: 14px; line-height: 1.5em; word-break: break-all; word-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;">< profile >
    < id > dev </ id >
    < properties >
    < spring.profiles.active > dev < /spring.profiles.active >
    </ properties >
    </ profile >
    < profile >
    < id > prod </ id >
    <属性>
    < spring.profiles.active > prod </ spring.profiles.active >
    </属性>
    </简介></pre>

  6. 测试执行

    请记住我们现在的身份设置文件5,分别是default, dev8, dev9,devprod这五个。

    尝试指定个人资料dev的情况

    <pre class="hljs dockerfile" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 0.75em; font-size: 14px; line-height: 1.5em; word-break: break-all; word-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;">mvn clean spring-boot:运行-Pdev</pre>

    <pre class="hljs groovy" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 0.75em; font-size: 14px; line-height: 1.5em; word-break: break-all; word-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;">$ curl本地主机:8080 Hello World:开发</pre>

    尝试指定个人资料prod的情况

    <pre class="hljs dockerfile" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 0.75em; font-size: 14px; line-height: 1.5em; word-break: break-all; word-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;">mvn clean spring-boot:运行-Pprod</pre>

    <pre class="hljs groovy" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 0.75em; font-size: 14px; line-height: 1.5em; word-break: break-all; word-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;">$ curl localhost: 8080 Hello World: Prod</pre>

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容