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

使用 Spring Boot CLI 快速创建专案(也可以使用Spring Initializr建立)
spring init --dependencies=web --groupId=com.duotify sbprofile1 使用 Visual Studio Code 开启该专案
代码sbprofile1 加入一个HomeController技术
档名路径:src/main/java/com/duotify/sbprofile1/controllers/HomeController.java
- <span style="color:#444444">#f6f6f6">#333333">包 #333333">com #880000">.duotify #880000">.sbprofile1 #880000">.controllers;
- #333333">导入 #333333">org #880000">.springframework #880000">.web #880000">.bind #880000">.annotation #880000">.GetMapping;
- #333333">导入 #333333">org #880000">.springframework #880000">.web #880000">.bind #880000">.annotation #880000">.RestController;
- @#333333">休息控制器
- 公共类 HomeController {
- @GetMapping #333333">( "/")
- 公共字符串主页(){
- #333333">返回“#333333">你好 #333333">世界”;
- }
- }
测试执行
mvn clean spring-boot:运行 补充说明:你可以在pom.xml的底下添加一个设置,未来只要打就可以mvn自动启动 Spring Boot 执行喔!:+1:
使用 cURL 测试
- $ curl本地主机:8080
- Hello World
春天的框架有一大堆抽象的概念,不好好花时间研究,会有很多恶魔般的细节无法理解。本文所提到的春天简介原本是一个很简单的概念,但是在写春天靴子的时候却是那样的有很多变化,可以让你脑袋打结什么。
我们先从最简单、最抽象的概念开始讲起。
配置文件(配置文件)常用这个名字( Profile Name),名字代表应用程序配置。你可以通过一个简单的设置名称(Profile Name),快速的切换应用程序配置,就这么简单!
其中应用程序配置包含了两层含意:
未配置(Configuration)
那个配置其实就是像这样的src/main/resources/application.properties属性定义档。
应用程序组件组合(组件组合)
应用程序组件组件组合使用的程序里面有哪些「」要启用,你就可以在应用程序执行期间通过本次启动的参数,简单地决定使用什么配置文件来执行应用程序启动。
使用Profile来管里应用配置,最常见的例子,就是用在「多环境」部署上,比如你有公司内部的「测试环境」与客户提供的「正式环境」,通常有哪些设定都一样,但也有一样的地方。此时我们就可以通过多个Profile中的这些差异,分别来管理之后,我们只要知道设置名称(Profile Name)就可以切换不同的环境。
在了解如何管里多个设置文件之前,应该先了解应用程序属性(Application Properties)应该怎么用。
的体验步骤如下:
编辑src/main/resources/application.properties属性档
加入一个my.profile属性值
我的。个人资料=dev 调整HomeController,添加一个私有字段(Private Field),并@Value通过添加来一个my.profile属性值
档名路径:src/main/java/com/duotify/sbprofile1/controllers/HomeController.java
- <span style="color:#444444">#f6f6f6">#333333">包 #333333">com #880000">.duotify #880000">.sbprofile1 #880000">.controllers;
- #333333">导入 #333333">org #880000">.springframework #880000">.beans #880000">.factory #880000">.annotation #880000">.Value;
- #333333">导入 #333333">org #880000">.springframework #880000">.web #880000">.bind #880000">.annotation #880000">.GetMapping;
- #333333">导入 #333333">org #880000">.springframework #880000">.web #880000">.bind #880000">.annotation #880000">.RestController;
- @#333333">休息控制器
- 公共类 HomeController {
- @Value #333333">( "${ <span style="color:#333333">my #880000">.profile }")
- "color:#333333">private "color:#333333">String "color:#333333">myProfile ;
-
- @GetMapping "color:#333333">( "/")
- 公共字符串主页(){
- <span style="color:#333333">返回“#333333">你好 #333333">世界:”+#333333">这个#880000">.myProfile;
- }
- }
测试执行
mvn clean spring-boot:运行 使用 cURL 测试
- "color:#444444">"background-color:#f6f6f6">$ curl"color:#880000">本地主机:"color:#880000">8080
- Hello "color:#880000">World:开发
当通过穿透属性的时候,加入属性,此时 Maven 需要一个pom.xml定义方法,我们希望将某个属性的值写入到“src/main/resources/application.properties属性文件中”。
的体验步骤如下:
编辑src/main/resources/application.properties属性档
加入一个my.profile属性值
我的.profile= @我的。轮廓@ 调整pom.xml档,在加入一个属性
< my.profile > dev2 my.profile > 测试执行
mvn clean spring-boot:运行 使用 cURL 测试
- "color:#444444">"background-color:#f6f6f6">$ curl"color:#880000">本地主机:"color:#880000">8080
- Hello "color:#880000">World: dev2
我们在特殊情况下,他会定义一个特殊的属性值,在特殊情况下,他会定义一个特殊的属性值,如果在编译时,Maven 会在编译时加入application.properties默认值,那是可以让你在执行期间才通过方法优点(赋值)。@my.profile@
直接从命令列参数参数
mvn clean spring- boot t:run -Dmy. 配置文件=dev3 - "color:#444444">"background-color:#f6f6f6">$ curl"color:#880000">本地主机:"color:#880000">8080
- Hello "color:#880000">World: dev3
直接值从环境变化数字属性
下面是 Bash 设定环境变数的语法:
my_profile =dev4 mvn clean spring-boot:run - "color:#444444">"background-color:#f6f6f6">$ curl"color:#880000">本地主机:"color:#880000">8080
- Hello "color:#880000">World: dev4
环境变数发生属性名称有小数点(.)的时候,记得转成底线(_)才可以。
先有档次,通过调用参数java -jar时也可以使用
mvn 清洁包 java -Dmy.profile=dev5 -jar 目标/ sbprofile1-0。0 . 1 -SNAPSHOT.jar 这个-Dmy.profile=dev5参数会使用JVM当系统参数。
- "color:#444444">"background-color:#f6f6f6">$ curl"color:#880000">本地主机:"color:#880000">8080
- Hello "color:#880000">World: dev5
请记住-Dmy.profile=dev5一定要设置在-jar前面!
先决条件,通过环境变量java -jar时也可以通过
mvn 清洁包 my_profile =dev6 java -jar 目标/sbprofile1- 0.0。1 -SNAPSHOT.jar - "color:#444444">"background-color:#f6f6f6">$ curl"color:#880000">本地主机:"color:#880000">8080
- Hello "color:#880000">World: dev6
请记住-Dmy.profile=dev5一定要设置在-jar前面!
直接从.env定义的环境变量
先在专案根目录加入一个.env档,内容如下:
我的个人资料 = dev7 建立一个启动设置档( VSCode .vscode/launch.json)
- {
- “版本”:“0.2.0”,
- “配置”:[
- {
- “type”:“java”,
- “name”:“Launch DemoApplication”,
- “request”:“launch”,
- “mainClass”:“com.duotify.sbprofile1.DemoApplication”,
- “projectName”:“sbprofile1”,
- “envFile” : "${workspaceFolder}/.env"
- }
- ]
- }
这里的重点envFile设定。
点击F5启动专案,就可以读取到设定值了!
- "color:#444444">"background-color:#f6f6f6">$ curl"color:#880000">本地主机:"color:#880000">8080
- Hello "color:#880000">World: dev7
在了解了 Properties 文件的使用与设置文件之后,终于可以进入到这里的重点内容,那是如何定义 Spring Profiles 文件的。
下面是体验步骤:
编辑src/main/resources/application.properties属性档
加入一个spring.profiles.active属性值
spring.profiles.active=@spring .profiles。积极的@ 这里将spring.profiles.active使用框架会使用的属性是 Spring 的一个名称,而正确的一个名称@spring.profiles.active@可以来自外部的属性。
pom.xml调整的设定档,加入Maven的设定
- < 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 >
属性比较不同的地方可以定义一个文件的属性,我们定义一个我们不同2的配置文件。 ,这个属性是用来给 Spring 应用程序参考当前启用的设置文件是谁。defaultdev8spring.profiles.active
请记住:你在pom.xml定义的属性()并且不会直接给 Java 程序参考,它们之间的关系是:
Java文件原始文件属性/应用程序文件属性/ml) <-- 属性属性外部属性。 修改HomeController的@Value标注,改注spring.profiles.active属性
- <span style="color:#444444">#f6f6f6">#333333">包 #333333">com #880000">.duotify #880000">.sbprofile1 #880000">.controllers;
- #333333">导入 #333333">org #880000">.springframework #880000">.beans #880000">.factory #880000">.annotation #880000">.Value;
- #333333">导入 #333333">org #880000">.springframework #880000">.web #880000">.bind #880000">.annotation #880000">.GetMapping;
- #333333">导入 #333333">org #880000">.springframework #880000">.web #880000">.bind #880000">.annotation #880000">.RestController;
- @#333333">休息控制器
- 公共类 HomeController {
- @Value ( "${ <span style="color:#333333">spring #880000">.profiles #333333">.active }")
- "color:#333333">private "color:#333333">String "color:#880000">myProfile "color:#333333">;strong>span>
-
- @GetMapping "color:#333333">( "/")
- 公共字符串主页(){
- <span style="color:#333333">返回“#333333">你好 #333333">世界:”+#333333">这个#880000">.myProfile;
- }
- }
测试执行
请记住我们现在有两个设置档,分别是default和这两个设置档dev8。当我们用mvn spring-boot:run启动应用程序的时候,就可以用-P外加一个ProfileName就可以启用设置档了。
mvn clean spring-boot:运行-Pdev8 注意:这里的-P必须P接上一个元素的大值写,而且后面的名称是pom.xml表格!
使用 cURL 测试
- "color:#444444">"background-color:#f6f6f6">$ curl"color:#880000">本地主机:"color:#880000">8080
- Hello "color:#880000">World: dev8
尝试设定一个名称:不存在的 dev9设定档是你自己的预设
mvn clean spring-boot:运行-Pdev9 - "color:#444444">"background-color:#f6f6f6">$ curl "color:#880000">localhost:"color:#880000">8080
- Hello "color:#880000">World: "color:#333333">默认
注意:是可以的,-P可以用两个图标来启用。例如,您可以启用以下命令来测试mvn help:active-profiles -Pdev,prod
使用 Spring 框架的 Profiles 功能,还有另外一个好处,那是你可以不用把属性设置在 Maven 的pom.xml文件里面,可以通过自定义的习惯,将应用程序设置在不同的文件.properties中。以下文件名称规格请见注解说明:
- # 这是预设的这个应用程序属性档,无论启用哪个设置,载入档案中的属性
- 应用程序属性
-
- #这是特定设置文件会套用的应用程序文件,只有启用的属性文件会载入文件中的属性
- application-{ProfileName}.properties
请注意:在application文件名后面要接上-(破折号)符号,然后接上你的ProfileName正确的命名规则。
就来一下多设置文件我们的套用体验情况:
我们再加入一个dev9设定档到pom.xml档中
- < 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 >
除了application.properties,我们另外建立两个应用程序属性文件
档案1:(src/main/resources/application.properties加入一个my.name属性)
- 我的.profile= @我的。profile@
- spring.profiles.active= @ spring.profiles。active@my.name=Will
- _
档案2:(src/main/resources/application-dev8.properties加入一个my.name属性)
#444444">我的。#333333">名字=约翰 档案3:(src/main/resources/application-dev9.properties空白内容)
修改HomeController的@Value标注,改注spring.profiles.active属性
- 包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;
- }
- }
测试执行
请记住我们现在的三个3设定档,分别是default,dev8与dev9这。
先尝试不指定个人资料的情况
mvn clean spring-boot:运行 - "color:#444444">"background-color:#f6f6f6">$ curl "color:#880000">localhost: "color:#880000">8080
- Hello "color:#880000">World:将
重新尝试指定个人资料dev8的情况
mvn clean spring-boot:运行-Pdev8 - "color:#444444">"background-color:#f6f6f6">$ curl "color:#880000">localhost:"color:#880000">8080
- Hello "color:#880000">World:约翰
最后尝试指定个人资料dev9的情况
mvn clean spring-boot:运行-Pdev9 - "color:#444444">"background-color:#f6f6f6">$ curl "color:#880000">localhost: "color:#880000">8080
- Hello "color:#880000">World:将
通过例如 Spring Profile 的不同设置方式进行设置,除了可以设置“属性”之外,重新设置(Profile)来加载的相依套件,与不同的版本(测试新旧版本)相同版本),不同的介面资料面但不同(不同模式库驱动)之类的,这点不同的套件很赞!:+1:
下面是不同版本的不同设置示例:
- < 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 >
如果想看套用不同的 Profile 之后的相依套件,可以执行以下命令:
mvn依赖:tree -Pdev8 下面是不同介面不同套件的设定示例:
- < 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 >
在春天的框架下,所有用@Component标注的这些类别全部都被注册成豆类元素,其中当然也包含@Configuration标注的类别,因为标注都继承自@Component介面。
然而,你只要在上面额外@Profile套上类别的标签,就可以很简单地宣布春天要在特定的个人资料下载入,以下是使用示例:
建立一个UserService类别
- 包com.duotify.sbprofile1.services;
-
- 公共 类 UserService {
- public UserService(String name) {
- this .name = name;
- }
- 私有字符串名称;
- public String getName() {
- 返回名称;
- }
- }
建立一个UserServiceDev类别
- <span style="color:#444444">#f6f6f6">#333333">包 #333333">com #880000">.duotify #880000">.sbprofile1 #880000">.services;
- #333333">导入 #333333">org #880000">.springframework #880000">.context #880000">.annotation #880000">.Bean;
- #333333">导入#333333">org #880000">.springframework #880000">.context #880000">.annotation #880000">.Profile;
- #333333">导入#333333">org #880000">.springframework #880000">.stereotype #880000">.Component;
- @#333333">组件
- @Profile( #880000">"dev" )
- 公共类 UserServiceDev {
- @#333333">豆
- 公共用户服务 getUserService() {
- #333333">返回 #333333">新的 #333333">用户服务(“#333333">开发”);
- }
- }
这个UserServiceDev只有在dev启用设置档时才会被Spring执行。
建立一个UserServiceProd类别
- <span style="color:#444444">#f6f6f6">#333333">包 #333333">com #880000">.duotify #880000">.sbprofile1 #880000">.services;
- #333333">导入 #333333">org #880000">.springframework #880000">.context #880000">.annotation #880000">.Bean;
- #333333">导入#333333">org #880000">.springframework #880000">.context #880000">.annotation #880000">.Profile;
- #333333">导入#333333">org #880000">.springframework #880000">.stereotype #880000">.Component;
- @#333333">组件
- @Profile( #880000">"!dev" )
- 公共类 UserServiceProd {
- @#333333">豆
- 公共用户服务 getUserService() {
- #333333">返回 #333333">新的 #333333">用户服务(“#333333">产品”);
- }
- }
这个只有在启用UserServiceDev非dev设置档时才会被 Spring 执行。
修改HomeController并通过「式」注入UserService服务
- 包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();
- }
- }
修改pom.xml再加入两个定义
- < 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 >
- 属性>
- 简介>
测试执行
请记住我们现在的身份设置文件5,分别是default, dev8, dev9,dev与prod这五个。
尝试指定个人资料dev的情况
mvn clean spring-boot:运行-Pdev - "color:#444444">"background-color:#f6f6f6">$ curl"color:#880000">本地主机:"color:#880000">8080
- Hello "color:#880000">World:开发
尝试指定个人资料prod的情况
mvn clean spring-boot:运行-Pprod - "color:#444444">"background-color:#f6f6f6">$ curl "color:#880000">localhost: "color:#880000">8080
- Hello "color:#880000">World: Prod