Spring Boot 中的外部化配置

Spring Boot 中的外部化配置

  • 一、配置文件基础
    • 1.配置文件格式
      • (1)YAML 基本语法规则
      • (2)YAML 支持三种数据结构
    • 2.application 文件
    • 3.application.properties 配置文件
    • 4.application.yml 配置文件
    • 5.Environment
    • 6.组织多文件
    • 7.多环境配置
  • 二、绑定 Bean
    • 1.多个简单的属性绑定
    • 2.嵌套 Bean
    • 3.扫描注解
    • 4.处理第三方库对象
    • 5.集合 Map、List 以及 Array
    • 6.指定数据源文件
  • 三、总结
    • 1.@Value:用于绑定单个属性
    • 2.绑定Bean:用于多个属性。


  • 应用程序 = 代码 + 数据(数据库,文件,url)
  • 应用程序的配置文件:Spring Boot 允许在代码之外,提供应用程序运行的数据,以便在不同的环境中使用相同的应用程序代码。避免硬编码,提供系统的灵活性。可使用各种外部配置源,包括 Java 属性文件YAML 文件、 环境变量命令行参数
  • 项目中经常使用 properties 与 yaml 文件,其次是命令行参数。

一、配置文件基础

1.配置文件格式

  • 配置文件有两种格式:properties 和 yaml(yml)。
    • properties 是 Java 中常用的一种配置文件格式,key=value。key 是唯一的,文件扩展名为 properties。
      • 关于 properties 文件格式的相关知识详见我的博客 ===> properties 属性配置文件
    • yaml(YAML,Ain’t Markup Language)也叫做 yml,是一种配置文件的数据格式,基本的语法 key:[这里必须有一个空格]值。yml文件的文件扩展名是 yaml 或 yml(常用)

(1)YAML 基本语法规则

  • 大小写敏感
  • 使用缩进表示层级关系
  • 缩进可以使用空格,不允许使用 Tab 键
  • 缩进的空格数目不重要,相同层级的元素左侧对齐即可
  • # 字符表示注释,只支持单行注释。# 放在注释行的第一个字符
  • 总结:YAML 缩进必须使用空格,而且区分大小写,建议编写 YAML 文件只用小写和空格。

(2)YAML 支持三种数据结构

  • 对象:键值对的集合,又称为映射(mapping)/哈希(hashes)/字典(dictionary)
#Map<String, User> users
users:
  user1:
  	name: 张三
  	age: 20
  	sex:user2:
  	name: 李四
  	age: 22
  	sex:
  • 数组:一组按次序排列的值,又称序列(sequence)/列表(list)
#集合以及数组
#List<Login> logins
logins:
  - login1:
    username: zhangsan
	password: 123456
  - login2: 
	username: wangwu
	password: 654321
#String[] names
names:
  - lisi
  - zhangsan
  • 标量(scalars):单个的,不可再分的值,例如数字、字符串、true|false 等
# 标量
security:
  username: zhangsan
  password: 123456
  • 注意:
    • “-” 表示集合的一个成员,因为成员是对象,需要属性名称指定属性值。
    • LIst 和 数组前面加入 “-” 表示一个成员。
    • Map 直接指定 key 和 value,无需 “-”。

2.application 文件

  • Spring Boot 同时支持 properties 和 yaml 格式的配置文件。配置文件名称默认是 application。我们可以使用 application.properties ,application.yaml。
  • 读取配置文件的 key 值,注入到 Bean 的属性可用@Value,@Value 一次注入一个 key 值。将多个 key 值绑定到 Bean 的多个属性用到 @ConfiguraionProperties 注解。 在代码中访问属性除了注解,Spring 提供了外部化配置的抽象对象 Environment。Environment 包含了几乎所有外部配置文件、环境变量,命令行参数的所有 key 和 value。需要使用 Environment 的注入此对象吗,调用它的方法 getProperty(String key) 方法即可。
  • 注意:
    • Spring Boot 建议使用一种格式的配置文件,如果 properties 和 yml 都存在。properties 文件优先。推荐使用 yml 文件。
    • application 配置文件的名称和位置都可以修改。约定名称为 application,位置在 resource 目录下。

3.application.properties 配置文件

  • 注解 @Value的语法格式:@Value(${“key:默认值”})
    在这里插入图片描述

4.application.yml 配置文件

在这里插入图片描述

5.Environment

  • Environment 是外部化的抽象,是众多数据来源的集合。从中可以读取 application配置文件,环境变量,系统属性。使用方式 在 Bean 中注入 Environment。调用它的 getProperty(String key) 方法。
    在这里插入图片描述

6.组织多文件

  • 大型集成的第三方框架,中间件比较多。每个框架的配置细节相对复杂。如果都将配置集中到一个 application 文件中,导致文件内容多,不易阅读。我们为每个框架建立一个独立的配置文件,最后将多个文件集中到 application 文件中。我们使用导入文件的功能。
  • 导入文件的语法: spring.config.import: conf/db.yml, conf/redis.yml
    • 导入多个配置文件,“,”作为分隔符。
      在这里插入图片描述

7.多环境配置

  • 在软件开发中环境的概念:影响软件运行的配置就叫做环境。例如应用访问数据库的 ip,用户名和密码,Rides 的端口,配置文件的路径,操作系统,服务器等。围绕着程序周围的都是环境。环境影响软件的运行。
  • Spring Profiles 表示环境,Profiles 有助于隔离应用程序配置,并使它们仅在某些环境中可用。常说开发环境、测试环境、生产环境等。一个环境就是一组相关的配置数据,支撑我们的应用在这些配置下运行。应用程序启动时指定适合的环境。
  • Spring Boot 规定环境文件的名称 application-{profile}.properties(yml)。其中 profile 为自定义的环境名称。profile是可以自定义的,但是一般推荐如下命名:
    • dev 表示开发。
    • test 表示测试。
    • prod 表示生产。
    • feature 表示特性。
  • Spring Boot 会加载 application 以及 application-{profile} 两类文件,不是单独加载 application-{profile}。
  • **在application-{profile}中设置环境名的语法:**spring.config.activate.on-profile: dev
  • 在application中激活环境的语法: spring.profiles.active: dev
    在这里插入图片描述

二、绑定 Bean

  • @Value 绑定单个属性,当属性较多时不方便,Spring Boot 提供了另一种。将多个配置项绑定到 Bean 的属性,提供强类型的 Bean。Bean 能够访问到配置数据。
  • 基本原则:标准的 JavaBean 有无参数构造方法,包含属性的访问器。配合 @ConfigurationProperties 注解一起使用。Bean 的 static 属性不支持。
  • Spring Boot 自动配置中大量使用了绑定 Bean 与 @ConfigurationProperties,提供对框架的定制参数。项目中要使用的数据如果是可变的,推荐在 yml 或 properties 中提供。项目代码具有较大的灵活性。
  • @ConfigurationProperties 能够配置多个简单类型的属性,同时支持 Map、List、数组类型。对属性还能验证基本格式。

1.多个简单的属性绑定

  • @ConfigurationProperties 声明在类上,表示绑定属性到此类。prefix 表示前缀,是配置文件中多个 key 的公共前缀。这些 key 以 “.” 作为分隔符。例如 app.name,app: name等。prefix=“app”,将文件中 app 开始的 key 都找到,调用与 key 相同名称的 setxxx 方法。如果有给属性赋值成功。没有的忽略。
    在这里插入图片描述

2.嵌套 Bean

在这里插入图片描述

3.扫描注解

  • @ConfigurationProperties 注解起作用,还需要@EnableConfigurationProperties 或@ConfigurationPropertiesScan。这两个注解是专门寻找@ConfigurationProperties注解的,将他的对象注入到 Spring 容器。在启动类上使用扫描注解。
    在这里插入图片描述
  • @EnableConfigurationProperties 适用于比较零散的类的情况。
  • @ConfigurationPropertiesScan 适用于整个的包扫描

4.处理第三方库对象

  • 如果某个类需要在配置文件中提供数据,但是没有源代码。此时 @ConfigurationProperties 结合 @Bean 在方法上一起使用。
  • 例如下面假如 AppConfiguration 类是第三方库中的类:
    在这里插入图片描述

5.集合 Map、List 以及 Array

在这里插入图片描述

6.指定数据源文件

  • application 做配置是经常使用的,除此以外我们能够指定某个文件作为数据源。@PropertiesSource 是主力,用以加载指定的 properties 文件。@Properties 与 @Configuration 一同使用,其他注解还有 #Value,@ConfigurationProperties。
    在这里插入图片描述

三、总结

1.@Value:用于绑定单个属性

  • 读取数据:@Value(“${key:defalutValue}”),使用 Environment.getProperties(“key”, “defalutValue”) 获取的是单个值(String,int,long,float,double等)

2.绑定Bean:用于多个属性。

  • 注解:@ConfigurationProperties
    • 位置:
      • ① 在类的上面,需要有源代码。
      • ② 方法上面,使用第三方对象。配合 @Bean 注解。
  • 数据来源 application 文件(properties 或 yml)
    • 指定数据来源 @PropertiesSource(value = “classpath:/xxxx.properties”)
  • 注意:
    • ① 类中有无参数构造方法。
    • ② 属性有 setxxxx 方法。
    • ③ static 属性无效。
    • ④ 使用 bean 的构造方法也能创建对象,无需 set 方法。
  • @ ConfigurationProperties 使用需要配合其他注解:
    • @Configuration
    • @EnableConfigurationProperties
    • @ConfigurationPropertiesScan
    • @Bean
  • 配置文件 application 名称和位置都是可以改变的。
  • application配置文件的位置:
    • 项目的根目录下
    • 项目根目录的 /config目录
    • resources/config
    • resources目录

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【JavaEE进阶】 MyBatis使用XML实现增删改查

文章目录 &#x1f38d;前言&#x1f340;配置连接字符串和MyBatis&#x1f343;写持久层代码&#x1f6a9;添加mapper接⼝&#x1f6a9;添加UserInfoXMLMapper.xml&#x1f6a9;单元测试 &#x1f334;增(Insert&#xff09;&#x1f6a9;返回⾃增id &#x1f38b;删(Delete)&…

spring Cloud Stream 实战应用深度讲解

springCloudStream 简介 Spring Cloud Stream是一个框架&#xff0c;用于构建与共享消息传递系统连接的高度可扩展的事件驱动微服务。 该框架提供了一个灵活的编程模型&#xff0c;该模型建立在已经建立和熟悉的 Spring 习惯用语和最佳实践之上&#xff0c;包括对持久发布/订…

matlab appdesigner系列-常用18-表格

表格&#xff0c;常用来导入外部表格数据 示例&#xff1a; 导入外界excel数据&#xff1a;data.xlsx 姓名年龄城市王一18长沙王二21上海王三56武汉王四47北京王五88成都王六23长春 操作步骤如下&#xff1a; 1&#xff09;将表格拖拽到画布上 2&#xff09;对app1右键进行…

解决方案 | 基于SFTP协议的文件传输断点续传Java实现方案

背景 因项目需要&#xff0c;我们服务每天都需要通过SFTP协议来对接上下游进行文件传输&#xff0c;但是对于一些大文件&#xff0c;在与第三方公司的服务器对接过程中很可能会因为网络问题或上下游服务器性能问题导致文件上传或者下载被中断&#xff0c;每次重试都需要重新对…

骨传导是表示啥?骨传导耳机的工作原理是什么

近期&#xff0c;骨传导耳机这种创新的产品引发了市场关注&#xff0c;也引起了大量用户的疑问&#xff1a;骨传导是表示啥&#xff1f;骨传导的工作原理是什么&#xff1f;下面让我们来详细解析一下骨传是表示啥&#xff1f;以及骨传导耳机的工作原理是什么。 骨传导是表示啥&…

在Word中插入高亮/好看代码

Md2All 一个markdown工具 Md2All 网址 代码一定要用code 高亮主题可选 atom-one-light > 复制到word > 调节字体可选Cnsolas, 间距等 效果 另一个高亮工具 效果

集简云新增邮件发送功能,适用多种创意场景并提升邮件发送效率

在数字营销中&#xff0c;电子邮件依旧是连接企业与客户的重要桥梁。集简云深知这一点&#xff0c;本周推出为企业通讯打造的内置应用——集简云邮件发送&#xff0c;帮助用户创建充满个性化的交易电子邮件&#xff0c;还能通过HTML自定义代码来实现用户的创意场景。可与近千款…

多态应用实例

目录 多态优点1.模拟冲泡饮品过程2.电脑组装 多态优点 多态的优点&#xff1a; 代码组织结构清晰&#xff1b;可读性强&#xff1b;利于前期和后期的扩展以及维护。 如果想扩展新的功能&#xff0c;不需要修改源码&#xff0c;遵循开发中开闭原则&#xff0c;只需在补充所需…

yml配置文件怎么引用pom.xml中的属性

目录 前言配置测试 前言 配置文件中的一些参数有时要用到pom文件中的属性&#xff0c;做到pom文件变配置文件中也跟着变&#xff0c;那如何才能做到呢&#xff0c;下面咱们来一起探讨学习。 配置 1.首先要在pom.xml中做如下配置&#xff0c;让maven渲染src/main/resources下配…

性能优化(CPU优化技术)-NEON 介绍

「发表于知乎专栏《移动端算法优化》」 本节主要介绍基本 SIMD 及其他的指令流与数据流的处理方式&#xff0c;NEON 的基本原理、指令以及与其他平台及硬件的对比。 &#x1f3ac;个人简介&#xff1a;一个全栈工程师的升级之路&#xff01; &#x1f4cb;个人专栏&#xff1a;…

【力扣】记录一下竞赛分上 Knight

记录一下力扣上 Knight 力扣的题还是相对来说比较简单的&#xff0c;前两个月写的题多一点&#xff0c;后面几乎都是只做了每日一题&#xff0c;感觉正常来说刷个两三个月的题水平就差不多够了&#xff0c;甚至在我才刷半个月的时候就可以做三题了&#xff0c;排名和现在差不多…

vue3源码(二)reactiveeffect

一.reactive与effect功能 reactive方法会将对象变成proxy对象&#xff0c; effect中使用reactive对象时会进行依赖收集&#xff0c;稍后属性变化时会重新执行effect函数。 <div id"app"></div><script type"module">import {reactive,…

2024年需要重点关注的15种计算机病毒

2024年&#xff0c;计算机病毒威胁变得愈发多元化和复杂化。涉及勒索病毒、二维码病毒、挖矿木马等15种类型&#xff0c;这些病毒从数据勒索到系统入侵&#xff0c;对全球网络安全构成严峻挑战。 2024年&#xff0c;计算机病毒威胁变得愈发多元化和复杂化。涉及勒索病毒、二维码…

Java 报错java.Net.UnknownHostException:raw.githubusercontent.com

1.问题 今天在vscode 学习如何使用 plantUML生成图片的时候&#xff0c;发生错误 java.util.concurrent.ExecutionException: java.net.UnknownHostException: raw.githubusercontent.com issue raw.githubusercontent.com java.util.concurrent.ExecutionException: java.n…

vulhub之Zabbix篇

CVE-2016-10134--SQL注入 一、漏洞介绍 zabbix是一款服务器监控软件&#xff0c;其由server、agent、web等模块组成&#xff0c;其中web模块由PHP编写&#xff0c;用来显示数据库中的结果。 漏洞环境 在vulhub靶场进行复现&#xff0c;启动zabbix 3.0.3。 二、复现步骤 1…

JL-03-Q6 校园气象站

产品概述 校园气象站针对测量与环境、科学研究等相关的气象指标进行设计制造&#xff0c;气象站对采集数据信息以图表、数据的形式真实、直观的反应当前环境数据指标。可通过各种传感器对气压、气温、相对湿度、风向、风速、雨量、太阳辐射、乃至空气质量等要素进行采集、存储…

Type-C平板接口协议芯片介绍,实现单C口充放电功能

在现代平板电脑中&#xff0c;Type-C接口已经成为了一个非常常见的接口类型。相比于传统的USB接口&#xff0c;Type-C接口具有更小的体积、更快的传输速度和更方便的插拔体验。但是&#xff0c;在使用Type-C接口的平板电脑上&#xff0c;如何实现单C口充电、放电和USB2.0数据传…

【后端技术】术有千法,道本归一

目录 1.概述 2.机器的问题 2.1.计算 2.2.存储 2.3.传输 3.人的问题 3.1.代码工程的管理 3.2.过程的把控 4.总结 1.概述 术有千法&#xff0c;道本归一。 之所以这样说&#xff0c;是因为当前出现的纷繁复杂的后端技术&#xff0c;其本质其实都是为了解决同一套问题。…

C++:迭代器失效问题

目录 1.vector迭代器失效问题 1.底层空间改变 ​编辑 2.指定位置元素的删除操作 2.Linux下的迭代器失效检测 1.扩容 2.删除 3.解决方法 1.vector迭代器失效问题 迭代器的主要作用就是让算法能够不用关心底层数据结构&#xff0c;其底层实际就是一个指针&#xff0c;或者是…

uniapp设置隐藏原生导航栏(3)

1、单个页面隐藏 在pages.json里配置 (第一种方式) {"path": "pages/home/index","style": {"navigationBarTitleText": "首页","navigationStyle": "custom" // 使用自定义导航栏&#xff0c;系统会关…