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: 20sex:user2:name: 李四age: 22sex:
  • 数组:一组按次序排列的值,又称序列(sequence)/列表(list)
#集合以及数组
#List<Login> logins
logins:- login1:username: zhangsanpassword: 123456- login2: username: wangwupassword: 654321
#String[] names
names:- lisi- zhangsan
  • 标量(scalars):单个的,不可再分的值,例如数字、字符串、true|false 等
# 标量
security:username: zhangsanpassword: 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目录

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

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

相关文章

什么是AI Agent

摘要 2023年11月&#xff0c;OpenAI首届开发者大会之后&#xff0c;比尔•盖茨写了一篇文章阐述了AI Agent彻底改变人机交互、颠覆软件行业&#xff0c;称之为“一个对科技行业的冲击波”、“一场自输入命令到点击图标变革之后计算机领域的最大变革”。想象一下&#xff0c;AI…

Soul CEO张璐积极履行反诈责任,倡导共建安全网络

近期,备受期待的反诈电影《鹦鹉杀》热映,深入剖析杀猪盘这一网络诈骗行为。为协助更多人增强反诈意识,备受欢迎的社交应用Soul App积极响应,在Soul CEO张璐的带领下,邀请电影中的演员和平台的反诈中心共同参与反诈宣传。此外,一旦用户在平台搜索“诈骗”、“杀猪盘”、“鹦鹉杀…

【算法题】74. 搜索二维矩阵

题目 给你一个满足下述两条属性的 m x n 整数矩阵&#xff1a; 每行中的整数从左到右按非严格递增顺序排列。 每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target &#xff0c;如果 target 在矩阵中&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 fa…

YoloV8改进策略:改进Neck|自研频域和空间注意力,超越GAM,CBAM等注意力|注意力创新改进|高效涨点|代码注释与改进|包括改进后的结构图

摘要 本文尝试改进了新的注意力,使用空间注意力和多轴频域注意力融合改进。改进后的注意力超越了GAM、BAM和CBAM等常用的注意力。 GAM # 导入PyTorch的神经网络模块 import torch.nn as nn # 导入PyTorch库 import torch # 定义一个名为GAM_Attention的类,继承自nn…

《WebKit 技术内幕》学习之十五(4):Web前端的未来

4 Cordova项目 Cordova是一个开源项目&#xff0c;能够提供将Web网页打包成本地应用格式的可运行文件。读者可能对Cordova项目陌生&#xff0c;但是大家可能对它的前身非常熟悉&#xff0c;那就是PhoneGap项目&#xff0c;它后来被Adobe公司收购。 图15-4描述了Cordova的主要工…

protobuf消息定义和使用注意事项

如果涉及到多端通讯&#xff0c;定义的protobuf消息格式可能不一样&#xff0c;会导致出现各种问题&#xff0c;比如名称或者消息的先后顺序&#xff0c;或者每个消息的id顺序不一致&#xff0c;都有可能导致解析不出来&#xff0c;我这里总结一下。 message消息名称可以不一致…

Ubuntu20.4 Mono C# gtk 编程习练笔记(四)

连续实时绘图 图看上去不是很清晰&#xff0c;KAZAM录屏AVI尺寸80MB&#xff0c; 转换成gif后10MB, 按CSDN对GIF要求&#xff0c;把它剪裁缩小压缩成了上面的GIF&#xff0c;图像质量大不如原屏AVI&#xff0c;但应该能说明原意&#xff1a;随机数据随时间绘制在 gtk 的 drawin…

Windows Server 安装 Docker

一、简介 Docker 不是一个通用容器工具&#xff0c;它依赖运行的 Linux 内核环境。Docker 实质上是在运行的 Linux 服务器上制造了一个隔离的文件环境&#xff0c;所以它执行的效率几乎等同于所部署的 Linux 主机服务器性能。因此&#xff0c;Docker 必须部署在 Linux 内核系统…

Leetcode 1268 搜索推荐系统

题目信息 LeetoCode地址: 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 题目理解 这道题的题意不难理解&#xff0c;在我们使用搜索引擎的每一天都会遇到&#xff0c;不需要输入完整的关键词&#xff0c;哪怕仅仅只输入一个字&#xff0c;搜索引…

前端框架 - htmx

前端框架很多&#xff0c;但是很多时候只是想要一个简单的功能&#xff0c;如点击一个按钮&#xff0c;然后发送一个请求&#xff0c;然后更新页面的某个部分&#xff0c;这个时候&#xff0c;就不需要复杂的前端框架&#xff0c;只需要一个简单的工具就可以了&#xff0c;这个…

【ArcGIS微课1000例】0095:横向图例制作案例教程

文章目录 一、加载数据二、高程分级显示三、横向图例四、注意事项一、加载数据 为了便于直观演示,本实验加载一个栅格数据(配套实验数据包中的0095.rar)并进行分级显示,效果如下: 二、高程分级显示 双击dem数据图层,打开栅格数据的【图层属性】对话框,切换到【符号系统…

最长公共子串的问题(正常方法和矩阵法,动态规划)

题目&#xff1a; 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 &#xff0c;返回 0 。 一个字符串的 子序列 是指这样一个新的字符串&#xff1a;它是由原字符串在不改变字符的相对顺序的情况下删除某些字符…

DAY31:贪心算法入门455、53、376

理论基础 贪心算法的基本思路是通过局部最优从而达到全局最优&#xff0c;但是有时候局部最优并不一定导致全局最优&#xff0c;这样就需要动态规划的方法。但一部分题目是能通过贪心得到的。贪心的证明一般用到数学归纳法和反证法。在实际的问题中&#xff0c;没有统一的代码…

Java通过模板替换实现excel的传参填写

以模板为例子 将上面$转义的内容替换即可 package com.gxuwz.zjh.util;import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import java.io.*; import java.util.HashMap; import java.util.Map; import java.io.IOException; impor…

linux系统nginx工具性能优化

nginx性能优化 nginx性能优化当前系统结构瓶颈了解业务模式性能与安全系统与nginx性能优化文件句柄系统全局性修改进程局部性修改cpu的亲和配置配置worker_processes nginx通用配置优化cpu绑定nginx 隐藏版本nginx 修改上传文件大小nginx 启用压缩传输 nginx性能优化 当前系统…

【算法题】76. 最小覆盖子串

题目 给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串&#xff0c;则返回空字符串 "" 。 注意&#xff1a; 对于 t 中重复字符&#xff0c;我们寻找的子字符串中该字符数量必须不少于 t 中该字符数…

conda多虚拟环境的搭建与切换

在 Python 开发中&#xff0c;很多时候我们希望每个应用有一个独立的 Python 环境&#xff08;比如应用 1 需要用到 TensorFlow 1.X&#xff0c;而应用 2 使用 TensorFlow 2.0&#xff09;。这时&#xff0c;Conda 虚拟环境即可为一个应用创建一套 “隔离” 的 Python 运行环境…

copilot和chatGPT的区别分析

Copilot是一个基于人工智能的代码提示工具&#xff0c;由GitHub和人工智能公司合作开发。它可以利用机器学习技术和大量训练数据生成高质量的代码&#xff0c;提高开发者的编码效率。Copilot的工作原理是基于自然语言处理、机器学习和深度神经网络技术&#xff0c;以及大规模实…

uni-app学习与快速上手

文章目录 一、uni-app二、学习与快速上手三、案例四、常见问题五、热门文章 一、uni-app uni-app是一种基于Vue.js开发框架的跨平台应用开发框架&#xff0c;可以用于同时开发iOS、Android、H5和小程序等多个平台的应用。uni-app的设计理念是一套代码可以编译到多个平台运行&a…

CentOS 7 下安装 Docker 及配置阿里云加速服务

一、系统要求与环境准备 在 CentOS 7 系统中安装 Docker 前&#xff0c;请确保您的内核版本满足最低要求&#xff08;Docker 要求内核版本至少为 3.10 或更高&#xff09;。运行以下命令检查当前内核版本&#xff1a; uname -r若内核版本符合条件&#xff0c;接着更新系统至最…