【Spring Boot 初识丨七 丨外部化配置(一)】属性详解

news2024/12/28 4:39:00

上一篇讲了 Spring Boot 的依赖注入
本篇来讲一讲Spring Boot 外部化配置
Spring Boot 初识:
【Spring Boot 初识丨一】入门实战
【Spring Boot 初识丨二】maven
【Spring Boot 初识丨三】starter
【Spring Boot 初识丨四】主应用类
【Spring Boot 初识丨五】beans
【Spring Boot 初识丨六】依赖注入

PropertySource

  • 加载顺序
  • 命令行属性
  • json应用程序属性
  • 加密属性
  • YAML属性
  • 配置随机值
  • 配置系统环境属性

加载顺序


  Spring Boot 使用一种非常特殊的PropertySource顺序,旨在允许合理地覆盖值。后面的属性源可以覆盖前面定义的值。按以下顺序考虑来源:

  1. 默认属性(由SpringApplication.setDefaultProperties指定)。
  2. @Configuration类上的@PropertySource注释。请注意,在刷新应用程序上下文之前,不会将此类属性源添加到环境中。这对于配置某些属性为时已晚,例如在刷新开始之前读取的logging.和spring.main.
  3. 配置数据(例如application.properties文件)。
  4. RandomValuePropertySource 加载random.* 形式的属性。
  5. 操作系统环境变量。
  6. Java 系统属性 ( System.getProperties())。
  7. 通过java:comp/env配置的 JNDI 属性
  8. ServletContext 初始化参数。
  9. ServletConfig 初始化参数。
  10. SPRING_APPLICATION_JSON(嵌入环境变量或系统属性中的内联 JSON)的属性。
  11. 命令行参数。
  12. 测试环境中的属性properties@SpringBootTest测试注解
  13. 测试中的@DynamicPropertySource注释。
  14. 测试环境中的 @TestPropertySource注解配置。
  15. Devtools 全局配置.$HOME/.config/spring-boot (当 devtools 被激活 ~/.spring-boot-devtools.properties)

配置数据文件按以下顺序考虑:

  1. jar 包外的 application-{profile}.propertiesapplication-{profile}.yml 配置
  2. jar 包内的 application-{profile}.propertiesapplication-{profile}.yml 配置
  3. jar 包外的 application.propertiesapplication.yml 配置
  4. jar 包内的 application.propertiesapplication.yml 配置

命令行属性


  默认情况下, SpringApplication 会获取--参数(例如 --server.port=9000 ),并将这个 property 添加到 Spring 的 Environment中。如前所述,命令行属性始终优先于基于文件的源属性。
  如果不想加载命令行属性,可以通过 SpringApplication.setAddCommandLineProperties(false) 禁用。

json应用程序属性


  环境变量和系统属性通常有限制,这意味着某些属性名称无法使用。为了解决这个问题,Spring Boot 允许您将一个属性块编码到单个 JSON 结构中。
  当您的应用程序启动时,任何spring.application.jsonSPRING_APPLICATION_JSON属性都将被解析并添加到Environment.
例如,可以在 UN*X shell 的命令行上提供SPRING_APPLICATION_JSON属性作为环境变量:

$ SPRING_APPLICATION_JSON='{"my":{"name":"test"}}' java -jar myapp.jar

在前面的示例中,您最终会进入Spring Environmentmy.name=test
同样的, 也可以提供JSON属性:

$ java -Dspring.application.json='{"my":{"name":"test"}}' -jar myapp.jar

或者json 命令行参数:

$ java -jar myapp.jar --spring.application.json='{"my":{"name":"test"}}'

如果要部署到经典的Application Server,您还可以使用名为java:comp/env/spring.application.json 的 JNDI 变量。

🔔注意:尽管JSON 中的null值将添加到结果属性源中,但PropertySourcesPropertyResolver会将null属性视为缺失值。这意味着JSON 无法使用null值覆盖来自低阶属性源的属性。

加密属性


  Spring Boot 不提供对加密属性值的任何内置支持,但是,它提供了修改 Spring Environment中包含的值所需的钩子点。EnvironmentPostProcessor 接口允许您在应用程序启动之前进行操作Environment。(如果想了解更多详细信息可以看这个:启动前自定义环境或ApplicationContext)
  如果您需要一种安全的方式来存储凭据和密码,Spring Cloud Vault项目提供了在HashiCorp Vault中存储外部化配置的支持。

YAML属性

YAML是 JSON 的超集,因此是指定分层配置数据的便捷格式。只要您的类路径上有SnakeYAML库,SpringApplication就会自动支持 YAML 作为属性的替代方案。有关YAML的详细可以看这篇(YAML)


Spring框架提供了两个方便的类,可用于加载YAML文档。

  • YamlPropertiesFactoryBean 将 YAML 文件的配置加载为 Properties
  • YamlMapFactoryBean 将 YAML 文件的配置加载为 Map

如果您想将 YAML 作为 Spring PropertySource加载,您也可以使用YamlPropertySourceLoader类。

示例:

environments:
  dev:
    url: "https://dev.example.com"
    name: "Developer Setup"
  prod:
    url: "https://another.example.com"
    name: "My Cool App"

等价于:

environments.dev.url=https://dev.example.com
environments.dev.name=Developer Setup
environments.prod.url=https://another.example.com
environments.prod.name=My Cool App

YAML 支持列表形式,等价于 property 中的 [index]

my:
 servers:
 - "dev.example.com"
 - "another.example.com"

等价于:

my.servers[0]=dev.example.com
my.servers[1]=another.example.com

📞 提示:
  使用[index]表示法的属性可以使用 Spring Boot 的类绑定到 Java ListSet 对象。

🔔警告:
  无法使用@PropertySource@TestPropertySource 注释加载 YAML 文件。因此,如果您需要以这种方式加载值,则需要使用属性文件。

YAML 多文档
  Spring Boot 允许您将单个物理文件拆分为多个逻辑文档,每个逻辑文档都是独立添加的。文件按从上到下的顺序处理。后面的文档可以覆盖前面文档中定义的属性。
  对于application.yaml文件,使用标准 YAML 多文档语法。三个连续的连字符代表一个文档的结束和下一个文档的开始。

spring:
  application:
    name: "MyApp"
---
spring:
  application:
    name: "MyCloudApp"
  config:
    activate:
      on-cloud-platform: "kubernetes"

对于application.properties文件,使用特殊#—或!—注释来标记文档拆分:

spring.application.name=MyApp
#---
spring.application.name=MyCloudApp
spring.config.activate.on-cloud-platform=kubernetes

配置随机值


  RandomValuePropertySource对于注入随机值(例如,注入秘密或测试用例)非常有用。它可以生成整数、长整型、uuid 或字符串,如以下示例所示:

my.secret=${random.value}
my.number=${random.int}
my.bignumber=${random.long}
my.uuid=${random.uuid}
my.number-less-than-ten=${random.int(10)}
my.number-in-range=${random.int[1024,65536]}

配置系统环境属性


  Spring Boot 支持为环境属性设置前缀。如果系统环境由具有不同配置要求的多个 Spring Boot 应用程序共享,这非常有用。系统环境属性的前缀可以直接在 SpringApplication上设置。

  例如,如果将前缀设置为input,则在系统环境中 诸如 remote.timeout 之类的属性也将被解析为input.remote.timeout

在这里插入图片描述

  如果喜欢的话,欢迎 🤞关注 👍点赞 💬评论 🤝收藏  🙌一起讨论
  你的评价就是我✍️创作的动力!					  💞💞💞

参考资料
Spring Boot 官方文档 features-external-config

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/686221.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

35岁的社区网格长李宝东,半个月搭建出一套网格化安全管理系统

2020年以来,网格化治理在陕西省榆林市榆阳区驼峰路街道的各个社区广泛应用。为了给社区群众提供高效、快捷的服务,驼峰路街道按照“11N”模式给社区配备服务人员。 网格员们穿梭于各个社区中,或是对平房、小区及商户进行常规巡查&#xff0c…

如何在 Spring Boot 中使用 OAuth2

在 Spring Boot 中使用 OAuth2 OAuth2 是一种授权协议,用于授权第三方应用程序访问受保护的资源。Spring Security 是一个强大的安全框架,支持 OAuth2 协议。在本文中,我们将介绍如何在 Spring Boot 中使用 Spring Security 实现 OAuth2 认证…

数据库性能优化必读,AntDB-M数据库的哈希索引设计

数据库加快访问速度的关键技术之一就是索引,索引的设计及使用方式极大程度上影响了数据库的性能。AntDB-M支持Hash、BTree两种索引类型。本文主要讲解Hash索引的相关设计,并给出一些使用建议。 1. 相关概念 桶 用于定位索引记录的容器,容器中…

python学习——列表

一、列表介绍 可以将列表视作一个容器,里面可以存储多个元素。这些元素可以是不同的数据类型。 二、列表的操作 2.1.列表的创建 方式一:使用中括号[]进行列表的创建,元素之间使用英文的逗号隔开。例如 在上图中,lst1是列表对象名…

Ant Design Vue - table实现跨页选择

实现下图跨页选择效果 :rowSelection"{ onSelect: onSelect, onSelectAll: onSelectAll, selectedRowKeys: selectedRowKeys, onChange: onSelectChange }"onSelectChange(selectedRowKeys, selectionRows) {console.log(select, this.selectedRowKeys, this.selecte…

ActiveMQ消息队列主从集群

文章目录 1.ActiveMQ消息队列主从集群模式1.1.主从集群架构1.2.环境规划 2.部署ActiveMQ主从高可用集群2.1.部署Zookeeper集群2.1.1.搭建Zookeeper三节点2.1.2.配置Zookeeper三节点2.1.3.配置Zookeeper各个节点的myid2.1.4.启动Zookeeper集群 2.2.部署ActiveMQ主从集群2.2.1.部…

解决90%面试问题!GitHub顶级“Java面试手册“了解下八股文天花板

前言 身为java开发工程师的你找到自己满意的工作了吗?又或者还在面试的路上经历一次又一次的失败。迟迟找不到正确的开门砖,也许你的技术能力可能并不差但就是在面试上得不到充分的证明。 而那些成功拿下自己满意的开发工作的人又是怎样做到的呢?我这一路走来也有…

2023下半年杭州/广州/深圳软考(中/高级)认证,进入备考

软考是全国计算机技术与软件专业技术资格(水平)考试(简称软考)项目,是由国家人力资源和社会保障部、工业和信息化部共同组织的国家级考试,既属于国家职业资格考试,又是职称资格考试。 系统集成…

Svg基本使用

1.说明 双闭合标签&#xff0c;默认宽度和高度300*150 svg绘制图形务必在svg标签内使用 ,可以通过样式设置宽高 svg与canvas区别就是它并不是图片 2.绘制直线 2.1代码展示 <linex1"100"y1"100"x2"500"y2"100"stroke"pink…

网络安全行业,面对供大于求的现状是怎么样的呢?

一、网络安全行业市场发展情况 网络时代生活越来越离不开网络&#xff0c;与此同时发生的网络安全攻击事件、非法入侵等等一系列事件都威胁着普通人的生活。没有网络安全保障&#xff0c;个人和企业等重要领域都暴露在风险之中。 二、网络安全行业人才发展需求 网络安全行业至…

【算法题】剪绳子、计算二进制中1的个数、数值的整数次方

剪绳子、计算二进制中1的个数、数值的整数次方 一、剪绳子1.1、题目描述1.2、思路1.3、代码实现&#xff1a;1.4、华丽的快速幂取余1.5、小结 二、数值的整数次方2.1、题目描述2.2、思路2.3、代码实现2.4、小结 三、计算二进制中1的个数3.1、题目描述3.2、思路3.3、代码实现3.4…

Kafka最基础使用

一、概念 2、应用场景 异步处理系统解耦流量削峰日志处理 3、消息队列的两种模式 点对点模式 消息发送者生产消息发送到消息队列中&#xff0c;然后消息接收者从消息队列中取出并且消费消息。消息被消费以后&#xff0c;消息队列中不再有存储&#xff0c;所以消息接收者不可…

(一)CSharp-网络编程

一、OSI 参考模型 &#xff08;1&#xff09;物理层 作为原始的位流或电气处理。 &#xff08;2&#xff09;数据链路层 负责建立、维持和释放数据链路的连接。 &#xff08;3&#xff09;网络层 选择合适的网间路由和交换结点&#xff0c;以确保数据及时传送。网络层将数据…

Flutter性能优化的一些路径思考

不可否认 Flutter 是一个非常强大的移动应用开发框架&#xff0c;我们在技术架构选型时就是选用的 Flutter&#xff0c;特别是跨端能力属实很优秀&#xff0c;but 也逐渐发现在复杂的应用程序实现中&#xff0c;App 的性能会受到一些影响。 其实这个问题&#xff0c;我们内部…

如何用Dialog DA1468X DK PRO测试其他板子的电流

2021.09.27 Jim 目录 工具准备... 1 PC上位机安装... 1 打开PC上位机... 1 消除DA1468X开发板本身底电流... 2 测试待测板子的功耗... 3 电压调节... 4 跳线帽... 6 工具准备 DA1468X DK PRO开发板一套&#xff0c;不需要装顶板的小板子&#xff0c;只需要母板&#…

「缤纷色彩的饼状图」:通过使用matplotlib库绘制饼状图,让读者期待在这个色彩缤纷的图表中探索数据的美丽。

嘿&#xff0c;大家好&#xff01;今天我要带你们探索一个有趣的话题&#xff1a;使用matplotlib库绘制饼状图。虽然这听起来可能有些复杂&#xff0c;但我会用轻松幽默的语言给大家讲解&#xff01;准备好了吗&#xff1f;让我们开始吧&#xff01; 首先&#xff0c;我们需要导…

人工智能的奥秘:机器学习的各大门派

本篇文章是博主在人工智能等领域学习时&#xff0c;用于个人学习、研究或者欣赏使用&#xff0c;并基于博主对人工智能等领域的一些理解而记录的学习摘录和笔记&#xff0c;若有不当和侵权之处&#xff0c;指出后将会立即改正&#xff0c;还望谅解。 文章分类在学习摘录和笔记专…

2023网络安全 -- 正向连接与反向连接

一、正向连接&#xff0c;Linux服务器主动控制windows服务器 1、上传nc到windows服务器上运行 2、以管理员身份运行cmd 3、执行下面命令&#xff0c;监听任意来自8899端口的数据&#xff0c;等待服务器来连接 nc -e cmd -lvvp 8899 4、Linux服务器执行如下命令&#xff0c;i…

解决USB设备PC不识别问题思路(亲测方案)

前言&#xff1a; 因环境是集控封锁USB端口的&#xff0c;所以刚碰到用户出现此问题&#xff0c;一般都认为是策略封堵拒绝了&#xff0c;但经过后面测试及权限查看是没问题的&#xff0c;所以深究一看&#xff0c;完全是USB设备都没有被PC主机识别的问题。按常规我们一般碰到这…

渗透怎么学?渗透测试中超全的提权思路来了!

提权Webshell&#xff1a;尽量能够获取webshell&#xff0c;如果获取不到webshell可以在有文件上传的地方上传反弹shell脚本&#xff1b;或者利用漏洞&#xff08;系统漏洞&#xff0c;服务器漏洞&#xff0c;第三方软件漏洞&#xff0c;数据库漏洞&#xff09;来获取shell。 …