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


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

    建立实例应用程序

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

      spring init --dependencies=web --groupId=com.duotify sbprofile1

      使用 Visual Studio Code 开启该专案

      代码sbprofile1
    2. 加入一个HomeController技术

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

      1. <span style="color:#444444">#f6f6f6">#333333"> #333333">com #880000">.duotify #880000">.sbprofile1 #880000">.controllers
      2. #333333">导入 #333333">org #880000">.springframework #880000">.web #880000">.bind #880000">.annotation #880000">.GetMapping
      3. #333333">导入 #333333">org #880000">.springframework #880000">.web #880000">.bind #880000">.annotation #880000">.RestController
      4. @#333333">休息控制器
      5. 公共类 HomeController {
      6. @GetMapping #333333">( "/")
      7. 公共字符串主页(){
      8. #333333">返回#333333">你好 #333333">世界”;
      9. }
      10. }
    3. 测试执行

      mvn clean spring-boot:运行

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

      使用 cURL 测试

      1. $ curl本地主机:8080
      2. Hello World

    理解设定档(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属性值

      我的。个人资料=dev
    2. 调整HomeController,添加一个私有字段(Private Field),并@Value通过添加来一个my.profile属性值

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

      1. <span style="color:#444444">#f6f6f6">#333333"> #333333">com #880000">.duotify #880000">.sbprofile1 #880000">.controllers
      2. #333333">导入 #333333">org #880000">.springframework #880000">.beans #880000">.factory #880000">.annotation #880000">.Value
      3. #333333">导入 #333333">org #880000">.springframework #880000">.web #880000">.bind #880000">.annotation #880000">.GetMapping
      4. #333333">导入 #333333">org #880000">.springframework #880000">.web #880000">.bind #880000">.annotation #880000">.RestController
      5. @#333333">休息控制器
      6. 公共类 HomeController {
      7. @Value #333333">( "${ <span style="color:#333333">my #880000">.profile }")
      8. "color:#333333">private "color:#333333">String "color:#333333">myProfile ;
      9. @GetMapping "color:#333333">( "/")
      10. 公共字符串主页(){
      11. <span style="color:#333333">返回#333333">你好 #333333">世界:”+#333333">这个#880000">.myProfile
      12. }
      13. }
    3. 测试执行

      mvn clean spring-boot:运行

      使用 cURL 测试

      1. "color:#444444">"background-color:#f6f6f6">$ curl"color:#880000">本地主机:"color:#880000">8080
      2. Hello "color:#880000">World:开发

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

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

    的体验步骤如下:

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

      加入一个my.profile属性值

      我的.profile= @我的轮廓@
    2. 调整pom.xml档,在加入一个属性

      < my.profile > dev2 my.profile >
    3. 测试执行

      mvn clean spring-boot:运行

      使用 cURL 测试

      1. "color:#444444">"background-color:#f6f6f6">$ curl"color:#880000">本地主机:"color:#880000">8080
      2. Hello "color:#880000">World: dev2

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

    • 直接从命令列参数参数

      mvn clean spring- boot t:run -Dmy. 配置文件=dev3
      1. "color:#444444">"background-color:#f6f6f6">$ curl"color:#880000">本地主机:"color:#880000">8080
      2. Hello "color:#880000">World: dev3
    • 直接值从环境变化数字属性

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

      my_profile =dev4 mvn clean spring-boot:run
      1. "color:#444444">"background-color:#f6f6f6">$ curl"color:#880000">本地主机:"color:#880000">8080
      2. Hello "color:#880000">World: dev4

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

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

      mvn 清洁
      java -Dmy.profile=dev5 -jar 目标/ sbprofile1-00 . 1 -SNAPSHOT.jar

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

      1. "color:#444444">"background-color:#f6f6f6">$ curl"color:#880000">本地主机:"color:#880000">8080
      2. Hello "color:#880000">World: dev5

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

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

      mvn 清洁
      my_profile =dev6 java -jar 目标/sbprofile1- 0.01 -SNAPSHOT.jar
      1. "color:#444444">"background-color:#f6f6f6">$ curl"color:#880000">本地主机:"color:#880000">8080
      2. Hello "color:#880000">World: dev6

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

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

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

      我的个人资料 = dev7

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

      1. {
      2. “版本”:“0.2.0”
      3. “配置”:[
      4. {
      5. “type”:“java”
      6. “name”:“Launch DemoApplication”
      7. “request”:“launch”
      8. “mainClass”:“com.duotify.sbprofile1.DemoApplication”
      9. “projectName”:“sbprofile1”
      10. “envFile” : "${workspaceFolder}/.env"
      11. }
      12. ]
      13. }

      这里的重点envFile设定。

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

      1. "color:#444444">"background-color:#f6f6f6">$ curl"color:#880000">本地主机:"color:#880000">8080
      2. Hello "color:#880000">World: dev7

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

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

    下面是体验步骤:

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

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

      spring.profiles.active=@spring .profiles积极的@

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

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

      1. < profiles >
      2. < profile >
      3. < id >默认id >
      4. < activation >
      5. < activeByDefault > true activeByDefault >
      6. activation >
      7. < properties >
      8. < spring.profiles.active > default < /spring.profiles.active >
      9. 属性>
      10. profile >
      11. < profile >
      12. < id >开发8 id >
      13. <属性>
      14. < spring.profiles.active > dev8 < /spring.profiles.active >
      15. properties >
      16. profile >
      17. profiles >

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

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

      Java文件原始文件属性/应用程序文件属性/ml) <-- 属性属性外部属性。
    3. 修改HomeController@Value标注,改注spring.profiles.active属性

      1. <span style="color:#444444">#f6f6f6">#333333"> #333333">com #880000">.duotify #880000">.sbprofile1 #880000">.controllers
      2. #333333">导入 #333333">org #880000">.springframework #880000">.beans #880000">.factory #880000">.annotation #880000">.Value
      3. #333333">导入 #333333">org #880000">.springframework #880000">.web #880000">.bind #880000">.annotation #880000">.GetMapping
      4. #333333">导入 #333333">org #880000">.springframework #880000">.web #880000">.bind #880000">.annotation #880000">.RestController
      5. @#333333">休息控制器
      6. 公共类 HomeController {
      7. @Value ( "${ <span style="color:#333333">spring #880000">.profiles #333333">.active }")
      8. "color:#333333">private "color:#333333">String "color:#880000">myProfile "color:#333333">;strong>span>
      9. @GetMapping "color:#333333">( "/")
      10. 公共字符串主页(){
      11. <span style="color:#333333">返回#333333">你好 #333333">世界:”+#333333">这个#880000">.myProfile
      12. }
      13. }
    4. 测试执行

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

      mvn clean spring-boot:运行-Pdev8

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

      使用 cURL 测试

      1. "color:#444444">"background-color:#f6f6f6">$ curl"color:#880000">本地主机:"color:#880000">8080
      2. Hello "color:#880000">World: dev8

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

      mvn clean spring-boot:运行-Pdev9
      1. "color:#444444">"background-color:#f6f6f6">$ curl "color:#880000">localhost:"color:#880000">8080
      2. Hello "color:#880000">World: "color:#333333">默认

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

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

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

    1. # 这是预设的这个应用程序属性档,无论启用哪个设置,载入档案中的属性
    2. 应用程序属性
    3. #这是特定设置文件会套用的应用程序文件,只有启用的属性文件会载入文件中的属性
    4. application-{ProfileName}.properties

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

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

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

      1. < profiles >
      2. < profile >
      3. < id >默认id >
      4. < activation >
      5. < activeByDefault > true activeByDefault >
      6. activation >
      7. < properties >
      8. < spring.profiles.active > default < /spring.profiles.active >
      9. 属性>
      10. profile >
      11. < profile >
      12. < id >开发8 id >
      13. < properties >
      14. < spring.profiles.active > dev8 < /spring.profiles.active >
      15. properties >
      16. profile >
      17. < profile >
      18. < id > dev9 id >
      19. < properties >
      20. < spring.profiles.active > dev9 < /spring.profiles.active >
      21. properties >
      22. profile >
      23. profiles >
    2. 除了application.properties,我们另外建立两个应用程序属性文件

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

      1. 我的.profile= @我的profile@
      2. spring.profiles.active= @ spring.profilesactive@my.name=Will
      3. _

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

      #444444">我的。#333333">名字=约翰

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

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

      1. com.duotify.sbprofile1.controllers;
      2. 导入org.springframework.beans.factory。注释.Value;
      3. 导入org.springframework.web.bind。注释.GetMapping;
      4. 导入org.springframework.web.bind。注释.RestController;
      5. @RestController
      6. 公共 HomeController {
      7. @Value( " ${spring.profiles.active} " )
      8. 私有字符串 myProfile;
      9. @Value( " ${my.name} " )
      10. 私有字符串 myName;
      11. @GetMapping( "/" )
      12. public String home() {
      13. return "Hello World:" + this .myName;
      14. }
      15. }
    4. 测试执行

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

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

      mvn clean spring-boot:运行
      1. "color:#444444">"background-color:#f6f6f6">$ curl "color:#880000">localhost: "color:#880000">8080
      2. Hello "color:#880000">World:

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

      mvn clean spring-boot:运行-Pdev8
      1. "color:#444444">"background-color:#f6f6f6">$ curl "color:#880000">localhost:"color:#880000">8080
      2. Hello "color:#880000">World:约翰

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

      mvn clean spring-boot:运行-Pdev9
      1. "color:#444444">"background-color:#f6f6f6">$ curl "color:#880000">localhost: "color:#880000">8080
      2. Hello "color:#880000">World:

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

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

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

      1. < profile >
      2. < id > dev8 id >
      3. < dependencies >
      4. < dependency >
      5. < groupId > org.springframework.boot groupId >
      6. < artifactId > spring-boot-starter-web artifactId >
      7. < version > 2.7.0 < /版本>
      8. 依赖>
      9. 依赖>
      10. <属性>
      11. < spring.profile.active> dev8 < /spring.profiles.active >
      12. 属性>
      13. profile >

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

      mvn依赖:tree -Pdev8
    • 下面是不同介面不同套件的设定示例:

      1. < profiles >
      2. < profile >
      3. < id >本地id >
      4. < dependencies >
      5. < dependency >
      6. < groupId > org.hsqldb groupId >
      7. < artifactId > hsqldb artifactId >
      8. < version > 2.3.3 version >
      9. < classifier > jdk5 分类器>
      10. 依赖>
      11. 依赖项>
      12. <属性>
      13. < jdbc.url > jdbc:hsqldb:file:databaseName < /jdbc.url >
      14. < jdbc.username > a < /jdbc.username >
      15. < jdbc.password > jdbc.password >
      16. < jdbc.driver > org.hsqldb.jdbcDriver jdbc.driver >
      17. properties >
      18. profile >
      19. < profile >
      20. < id > MySQL 身份证>
      21. < dependencies >
      22. < dependency >
      23. < groupId > mysql groupId >
      24. < artifactId > mysql-connector-java artifactId >
      25. < version > 5.1.38 version >
      26. dependency >
      27. dependencies >
      28. < properties >
      29. < jdbc. url > jdbc:mysql://mysql.website.ac.uk:3306 jdbc.url >
      30. < jdbc.username >用户< /jdbc.username >
      31. < jdbc.password > 1234 < /jdbc.password >
      32. < jdbc.driver > com.mysql.jdbc.Driver < /jdbc.driver >
      33. properties >
      34. profile >
      35. profiles >

    透过 Spring Profiles 载入不同 Beans

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

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

    1. 建立一个UserService类别

      1. com.duotify.sbprofile1.services;
      2. 公共 UserService {
      3. public UserService(String name) {
      4. this .name = name;
      5. }
      6. 私有字符串名称;
      7. public String getName() {
      8. 返回名称;
      9. }
      10. }
    2. 建立一个UserServiceDev类别

      1. <span style="color:#444444">#f6f6f6">#333333"> #333333">com #880000">.duotify #880000">.sbprofile1 #880000">.services
      2. #333333">导入 #333333">org #880000">.springframework #880000">.context #880000">.annotation #880000">.Bean
      3. #333333">导入#333333">org #880000">.springframework #880000">.context #880000">.annotation #880000">.Profile
      4. #333333">导入#333333">org #880000">.springframework #880000">.stereotype #880000">.Component
      5. @#333333">组件
      6. @Profile( #880000">"dev" )
      7. 公共类 UserServiceDev {
      8. @#333333">
      9. 公共用户服务 getUserService() {
      10. #333333">返回 #333333">新的 #333333">用户服务(“#333333">开发”);
      11. }
      12. }

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

    3. 建立一个UserServiceProd类别

      1. <span style="color:#444444">#f6f6f6">#333333"> #333333">com #880000">.duotify #880000">.sbprofile1 #880000">.services
      2. #333333">导入 #333333">org #880000">.springframework #880000">.context #880000">.annotation #880000">.Bean
      3. #333333">导入#333333">org #880000">.springframework #880000">.context #880000">.annotation #880000">.Profile
      4. #333333">导入#333333">org #880000">.springframework #880000">.stereotype #880000">.Component
      5. @#333333">组件
      6. @Profile( #880000">"!dev" )
      7. 公共类 UserServiceProd {
      8. @#333333">
      9. 公共用户服务 getUserService() {
      10. #333333">返回 #333333">新的 #333333">用户服务(“#333333">产品”);
      11. }
      12. }

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

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

      1. com.duotify.sbprofile1.controllers;
      2. 导入org.springframework.beans.factory。注释.Value;
      3. 导入org.springframework.web.bind。注释.GetMapping;
      4. 导入org.springframework.web.bind。注释.RestController;
      5. 导入com.duotify.sbprofile1.services.UserService;
      6. @RestController
      7. 公共 HomeController {
      8. @Value( " ${spring.profiles.active} " )
      9. 私有字符串 myProfile;
      10. @Value( " ${my.name} " )
      11. 私有字符串 myName;
      12. 私人用户服务 svc;
      13. 公共HomeController(UserService svc) {
      14. 这个.svc = svc;
      15. }
      16. @GetMapping( "/" )
      17. public String home() {
      18. return "Hello World:" + this .svc.getName();
      19. }
      20. }
    5. 修改pom.xml再加入两个定义

      1. < profile >
      2. < id > dev id >
      3. < properties >
      4. < spring.profiles.active > dev < /spring.profiles.active >
      5. properties >
      6. profile >
      7. < profile >
      8. < id > prod id >
      9. <属性>
      10. < spring.profiles.active > prod spring.profiles.active >
      11. 属性>
      12. 简介>
    6. 测试执行

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

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

      mvn clean spring-boot:运行-Pdev
      1. "color:#444444">"background-color:#f6f6f6">$ curl"color:#880000">本地主机:"color:#880000">8080
      2. Hello "color:#880000">World:开发

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

      mvn clean spring-boot:运行-Pprod
      1. "color:#444444">"background-color:#f6f6f6">$ curl "color:#880000">localhost: "color:#880000">8080
      2. Hello "color:#880000">World: Prod

       

  • 相关阅读:
    make编译出错Relocations in generic ELF (EM: 62)
    python常用pandas函数nlargest / nsmallest及其手动实现
    大学大创项目:手机室内AR导航APP项目思路
    Springboot毕设项目旅游信息采集管理与分享系统n2qez(java+VUE+Mybatis+Maven+Mysql)
    MySQL基本SQL语句之高级操作
    数字图像处理(入门篇)目录
    程序员都看不懂的代码
    用 Python实现Python解释器
    分布式微服务架构中的关键技术解析
    时间轮TimeWheel工作原理解析
  • 原文地址:https://blog.csdn.net/Candyz7/article/details/126966870