SpringBoot读取yml和properties配置文件实现属性注入

1,238 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第27天,点击查看活动详情

一、属性注入

1-1、配置文件值注入

1-1-1、将YAML映射到属性

1-1-1-1、使用K:V的方式注入

1-1-1-1-1、application.yml配置

image.png

1-1-1-1-2、创建beans,通过@Value使用配置文件属性值

image.png

1-1-1-1-3、测试执行

将user对象注入到测试类中,然后进行输出可以看到,通过@Value映射的值已经成功注入 image.png

1-1-1-2、使用@ConfigurationProperties的方式注入数据

在bean上使用@ConfigurationProperties,并且设置前缀就可以引入yml中的数据。bean中的属性和yml中的属性名称绑定,不区分大小写,并且可以使用“-”,“_”都可以进行映射,如user_name/user-name/userName/UserName/USERNAME

1-1-1-2-1、添加注解@ConfigurationProperties,并测试

如下给注解添加prefix并设置为user,这样就可以去yml中找到前缀是user的配置信息,将其对应的属性映射到bean的属性上面。 image.png

1-1-1-2-2、数据校验

通过给bean添加@ConfigurationProperties,然后再添加@Validation就可以使用JSR303校验了

1-1-1-2-2-1、引入validation start
<!--数据校验-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>
1-1-1-2-2-2、给bean添加@Validation注解,并且给需要校验的属性添加对应注解

image.png

测试结果如下:

image.png

1-1-1-3、引入外部配置文件属性注入

1-1-1-3-1、使用@PropertySource注解引入配置文件

image.png

1-1-1-3-2、user.properties配置文件
user.user-name= ${random.uuid}
user.age=${random.int[1,100]}
user.birthday= 2020/01/01
user.hobbies= 唱歌,跳舞
user.girl-friend.18=  范冰冰 
user.girl-friend.20= 迪丽热巴
user.address.id=1
user.address.desc=${user.user-name}的家在北京 

需要注意的是使用properties使用:
数组为
user.hobbies= 唱歌,跳舞
map为:
user.girl-friend.18= 范冰冰
user.girl-friend.20= 迪丽热巴
bean对象为
user.address.id=1
user.address.desc=${user.user-name}的家在北京

1-1-2、@Value获取值和@ConfigurationProperties获取值比较

@ConfigurationProperties@Value
绑定批量注入配置文件中的属性一个个指定
松散绑定(松散语法)支持支持有限
SpEL不支持支持
自动提示支持不支持

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

1-1-2-1、自动提示的支持

1-1-2-1-1、添加依赖
<!--会生成MET-INF元数据 用于提供idea自动提示配置文件的-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <version>2.6.6</version>
    <!--依赖不会传播,如果有其他moudle引用本moudle,此依赖不会被传播到其他moudle-->
    <optional>true</optional>
</dependency>
1-1-2-1-2、修改idea注解配置

image.png

1-1-2-1-3、编译代码

配置以上信息之后,编译代码就会在target中生成元数据信息 image.png

1-1-2-1-4、查看效果

在输入bir的时候,就会进行自动提示相关匹配的属性了,这样是不是很方便了。 image.png

1-1-2-2、使用场景

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

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

1-1-3、yml配置文件支持的相关类型

上面通过@Value和@ConfigurationProperties演示了字符串和数字,下面来看下其他数据类型,如有控制台输出有中文乱码,可以进行如下设置

image.png

1-2-3-1、Date日期格式

image.png

1-2-3-4、List、Set格式

1-2-3-4-1、用- 值表示数组中的一个元素

image.png

1-2-3-4-2、行内写法

image.png

1-2-3-5、Map格式

以下两种写法,0/1代表key,后面的值代表value,key:后面一定要加空格

1-2-3-5-1、折行写法

image.png

1-2-3-5-2、行内写法

image.png

1-2-3-4、引用对象

如果引用的是对象,需要注意要使用被引用bean的属性,然后对应相关值 image.png

1-1-4、yml支持的占位符(不支持表达式)

1-1-4-1、属性占位符的使用

这个地方需要注意的是只支持属性的引用,不支持SPEL表达式如:${1*3} image.png

1-1-4-1、随机数

${random.value}--获取随机字符串
${random.int}  --获取随机数字
${random.long} --获取随机long类型数字
${random.int(10)}--获取10以内的随机数
${random.uuid} --随机获得uuid值
${random.int[1024,65536]}--获取1024-65536之间的随机数