SpringBoot - yml与properties配置文件及bean赋值

① SpringBoot的配置文件

SpringBoot使用一个全局的配置文件,配置文件名是固定的 :

application.properties

application.yml

配置文件的作用 : 修改SpringBoot自动配置的默认值(SpringBoot在底层已经配置好的属性)。

② yml 是什么?

YAML(YAML Ain’t Markup Language) 

YAML A Markup Language:是一个标记语言 

YAML isn’t Markup Language:不是一个标记语言;

YAML:以数据为中心,比json、xml等更适合做配置文件。

配置例子-更改Tomcat默认端口 :


③ YAML语法

YAML使用缩进表示层级关系,缩进时不允许使用Tab键,只允许使用空格。缩进的空格的数目不重要,只要相同层级的元素左侧对齐即可。

YAML支持三种数据结构 :

对象 : 键值对的集合;

数组 : 一组按次序排列的值;

字面量 : 单个的不可分割的值。

语法格式如下 :

④ YAML值的写法

一般值有三种类型 : 字面量,即普通的值(数字,字符串,布尔);对象、map(键值对);数组(list set)。

(4.1)字面量

字符串默认不用加上单引号或者双引号;

“”:双引号;不会转义字符串里面的特殊字符;特殊字符会作为本身想表示的意思

”:单引号;会转义特殊字符,特殊字符最终只是一个普通的字符串数据

name:‘zhangsan \n lisi’; 输出:zhangsan \n lisi

(4.2)对象、map

k: v:在下一行来写对象的属性和值的关系;注意缩进 

对象还是k: v的方式

friends:lastName: zhangsan    age:20

行内写法:

friends:{lastName: zhangsan,age: 18}

(4.3)数组

用- 值表示数组中的一个元素

pets:‐ cat‐ dog‐ pig

行内写法

pets:[cat,dog,pig]

⑤ 使用yaml为bean赋值

(5.1) 添加依赖

官网如下 : 

https://docs.spring.io/spring-boot/docs/2.0.2.RELEASE/reference/html/configuration-metadata.html#configuration-metadata-annotation-processor


(5.2)JavaBean

(5.3)编写yml配置文件

(5.4)使用SpringBoot 测试

测试结果如下所示 :

Spring容器中的bean被yml中的配置正确赋值!

⑥ properties配置文件

properties配置文件是以前项目中常用的配置文件,SpringBoot同样保留了该种类型的配置文件。

如下所示,在properties文件中为person赋值:

运行测试 :

正常获取到值,但是中文乱码,为什么?

应该项目中都遇到这样的例子,读取properties文件中的中文乱码。以前解决办法就是将properties文件中的中文转换为Unicode形式,如\u822a\u6bcd。或者将其重新编码再解码。

idea中解决方法如下图:

将其转换为ASCII,其与Unicode是可以相互转换的。

再次测试:

⑦ @Value为bean赋值

在以前的项目中常用为bean赋值(从properties文件中获取值)的方法有两种:

第一种-xml配置 :

示例如下


第二种-@Value

⑧ @Value获取值和@ConfigurationProperties获取值比较

松散绑定 :

上面几种写法在@ConfigurationProperties环境下都可以对应到person对象的firstName属性。@Value则必须保证取的键与properties文件中一致。

JSR303校验:

@Value 不支持JSR3030校验,但是支持SpELl语法。@ConfigurationProperties则相反。

对比总结如下:

总结如下:

配置文件yml还是properties他们都能获取到值;

如果说,我们只是在某个业务逻辑中需要获取一下配置文件中的某项值,使用@Value;

如果说,我们专门编写了一个javaBean来和配置文件进行映射,我们就直接使用@ConfigurationProperties;

那么能否在业务逻辑类中使用@ConfigurationProperties呢?

不建议使用,@ConfigurationProperties会将本类中的所有属性和配置文件中相关的配置进行绑定。尤其@ConfigurationProperties支持松散语法。

⑨ @PropertySource加载指定的配置文件

将一切配置全部写在全局配置文件中,是不可想象的。项目中不可避免存在多个配置文件。@PropertySource就可以根据需要加载指定的配置文件(@ConfigurationProperties 默认从全局配置文件获取配置)。

这里将person的属性配置单独写在person.properties文件中,并从全局配置文件中注释掉person的属性配置。

为了对比person的属性从不同配置文件赋值,这里将全局配置文件中保留person.lastName属姓配置。

测试如下:

分析可知,默认从全局配置文件中为person赋值,这里为lastName赋值小明。person的其他属性从person.properties文件中获取。

⑩ 多个配置文件同属性配置@Value取值

如果项目中不同配置文件中配置同属性,使用@Value该如何取值呢?

如图一:

application.properties与person.properties同时配置了属性person.last-name,如图中所示,使用@Value取值,此时取到的值为application.properties中的值。

若将application.properties中的person.last-name注释掉,则取的为person.properties值。

那么是否说明,默认从全局配置文件取还是按照上次顺序依次检查呢?

如图二所示:

修改application.properties为tapplication.properties文件,将会从application.yml到tapplication.properties依次查找,如找到该属性则取其值。

那么是否说明了配置文件的加载次序呢?参考博客:SpringBoot配置文件加载位置与优先级

(11)@ImportResource导入Spring配置文件

Spring Boot里面没有Spring的配置文件,我们自己编写的配置文件,也不能自动识别。那么如何使用我们自己编写的配置文件呢?

在主配置类添加@ImportResource注解,如下图:

配置文件内容如下:

测试如下:

在主配置类使用ImportResource引入自定义Spring配置文件,即可获取helloService bean。

(12)SpringBoot推荐给容器中添加组件的方式

SpringBoot推荐使用配置类的方式来给容器中添加组件。如下所示:

测试结果如下图: 

(13)配置文件占位符

除了前面说的几种方式,还可以使用占位符的方式在配置文件中为属性赋值。

① 随机数

示例如下:

person.last‐name=张三${random.uuid}

② 占位符获取之前配置的值,如果没有可以是用:指定默认值

示例如下:

${person.hello:hello}意思为如果person.hello没有值则默认赋值为hello。${person.hello}如果有值,则取值,无值则会当作字面量解析–${person.hello}原样赋值。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容