在任何开发框架中,多环境管理通常是重要的核心功能,在 Spring 框架中也不例外,这里称为我们的Spring Profiles设置文件的功能说起来很简单,但实现起来却是一个功能。小心乱掉掉的文章我很愿意来讨论一番,很容易把话题搞清楚才不会管得了。
建立实例应用程序
-
使用 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>
-
加入一个
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> -
测试执行
<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),快速的切换应用程序配置,就这么简单!
其中应用程序配置包含了两层含意:
-
未配置(Configuration)
那个配置其实就是像这样的
src/main/resources/application.properties
属性定义档。 -
应用程序组件组合(组件组合)
应用程序组件组件组合使用的程序里面有****哪些「」要启用,你就可以在应用程序执行期间通过本次启动的参数,简单地决定使用什么配置文件来执行应用程序启动。
使用Profile来管里应用配置,最常见的例子,就是用在「多环境」部署上,比如你有公司内部的「测试环境」与客户提供的「正式环境」,通常有哪些设定都一样,但也有一样的地方。此时我们就可以通过多个Profile中的这些差异,分别来管理之后,我们只要知道设置名称(Profile Name)就可以切换不同的环境。
如何使用应用程序属性(Application Properties)
在了解如何管里多个设置文件之前,应该先了解应用程序属性(Application Properties)应该怎么用。
的体验步骤如下:
-
编辑
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>
-
调整
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> -
测试执行
<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
属性文件中”。
的体验步骤如下:
-
编辑
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>
-
调整
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>
-
测试执行
<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 文件的。
下面是体验步骤:
-
编辑
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@
可以来自外部的属性。 -
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>
-
修改
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> -
测试执行
请记住我们现在有两个设置档,分别是
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
正确的命名规则。
就来一下多设置文件我们的套用体验情况:
-
我们再加入一个
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> -
除了
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
空白内容) -
修改
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>
-
测试执行
请记住我们现在的三个
3
设定档,分别是default
,dev8
与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:运行</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
套上类别的标签,就可以很简单地宣布春天要在特定的个人资料下载入,以下是使用示例:
-
建立一个
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> -
建立一个
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执行。 -
建立一个
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>这个只有在启用
UserServiceDev
非dev
设置档时才会被 Spring 执行。 -
修改
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>
-
修改
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> -
测试执行
请记住我们现在的身份设置文件
5
,分别是default
,dev8
,dev9
,dev
与prod
这五个。尝试指定个人资料
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>