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(常用)。
- properties 是 Java 中常用的一种配置文件格式,key=value。key 是唯一的,文件扩展名为 properties。
(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目录