当前位置:网站首页>第三方bean使用ConfigurationProperties注解获取yml配置文件数据 & 获取yml配置文件数据的校验
第三方bean使用ConfigurationProperties注解获取yml配置文件数据 & 获取yml配置文件数据的校验
2022-08-09 17:15:00 【lwj_07】

=========================================================================
创建一个普通的springboot工程:


一、ConfigurationProperties注解
1.1、自定义bean使用ConfigurationProperties注解
在yaml数据格式笔记中我们学过,该ConfigurationProperties注解的作用:就是通过该注解把yml配置文件中的数据封装到实体类的属性当中,注意:yml配置文件中的数据属性名要和实体类当中的属性名一致,要不然封装不上数据(忘记的话看笔记)
代码演示ConfigurationProperties注解的作用如下所示:
yml配置文件中的数据如下所示:

实体类MyDataEnterprise:
package com.Bivin.config;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
* MyDataEnterprise类: 该类就是用来获取封装yml配置文件中的数据的
*
* 注意一:一定要保证该类中的属性名要和yml配置文件的配置名一致,要不然封装不到数据
*
* 注意二:把该实体类配置成bean注解的目的是因为:该实体类是用来封装yml配置文件中的一些数据的,
* 所以应该受spring管控,因此配置成bean的形式
*
* 注意三:@ConfigurationProperties(prefix = "servers")注解的作用:就是获取yml配置文件中的
* servers里面的数据,把yml配置文件中的servers里面的数据封装到该实体类的属性中
* (要保证servers里面的属性名和实体类中的属性名一致才能进行封装获取)
*/
@Data // 该注解是快速开发实体类的(使用该注解不用再写toString、getter、setter方法了,已经写好了)别忘记导lombok坐标
@Component // bean注解
@ConfigurationProperties(prefix = "servers")
public class MyDataEnterprise {
private String ipAddress;
private int port;
private long timeout;
}
springboot引导类(也可以获取bean对象,忘记的话看前面笔记):

会发现,通过ConfigurationProperties注解,yml配置文件中的数据确实封装到了实体类的属性当中了。
1.2、第三方bean使用ConfigurationProperties注解
思考:上面我们用一个 bean(bean:对象) 加上ConfigurationProperties注解的时候,可以把yml配置文件中的一些数据封装到该bean的属性当中,我们上面演示的是自定义的bean,如果这个bean不是我们自定义的呢?假如是一个第三方的bean呢:
因此第三方bean的时候,通过该注解形式如何把yml配置文件中的数据封装到第三方bean的属性当中呢:
模拟第三方bean:Druid (别忘记导入Druid的坐标)
代码演示如下所示:
下面演示的代码只不过是把第三方bean写在了引导类当中的@Bean注解当中了,实际意思还是和我们自定义的bean的意义是一样的:
package com.Bivin;
import com.Bivin.config.MyDataEnterprise;
import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Bean;
@SpringBootApplication
public class Springboot07ConfigurationApplication {
/**
* 第三方bean: Druid
*
* 在这里使用@Bean注解 和 上面我们自定义的bean形式是一样的
* 相当于说MyDataEnterprise的代码在这里面写了
*/
@Bean
public DruidDataSource dataSource(){
DruidDataSource dataSource = new DruidDataSource();
// 手动给第三方bean的属性(driverClassName属性)赋值
dataSource.setDriverClassName("com.mysql.jdbc.Driver123");
return dataSource;
}
public static void main(String[] args) {
ConfigurableApplicationContext run = SpringApplication.run(Springboot07ConfigurationApplication.class, args);
// 获取bean
DruidDataSource bean = run.getBean(DruidDataSource.class);
// 获取bean对象的DriverClassName属性值
System.out.println(bean.getDriverClassName());
}
}

但是思考:我们第三方bean的属性值是我们手动进行赋值的,我们能不能把第三方bean的属性值写在yml配置文件中,然后通过某种注解,封装到第三方bean的属性中呢:
当然可以演示如下所示:(同样要保证yml配置文件中的配置名要和bean的属性名一致,要不然封装不上数据)
通过ConfigurationProperties注解,把yml配置文件中的数据直接封装到第三方bean的属性当中



1.3、解除使用ConfigurationProperties注解警告

二、宽松绑定

注1:宽松绑定下面四种写法只适用于@ConfigurationProperties注解当中(可以让实体类的属性名和yml配置文件中的配置名不一致,同样可以把yml文件中数据封装到实体类的属性当中),在@Value注解当中就不能使用宽松绑 定的那四种形式了(要保证yml配置文件中的配置名和实体类的或者属性的属性名保持一致,那么才能封装上yml配置文件中的数据)
注2:但是使用了上面的宽松绑定的四种yml配置文件中配置名的写法后,要想通过@ConfiggurationProperties(prefix="#")注解获取到用上面四种方式写的yml配置文件中的配置名数据的话,要遵守以下规则:

这里演示的是datasource的配置名, 如果上面的yml配置文件中的servers:.... 数据,servers配置名写成Servers形式,那么通过@ConfigurationProperties(prefix="servers")注解的形式获取yml配置文件中的Servers数据的时候,这个prefix里面就要纯小写形式servers才能获取到yml配置文件中的Servers配置名中的数据
三、常用计量单位

代码演示如下:

四、bean属性数据校验
也就是说,bean中的属性通过@ConfigurationProperties注解获取yml配置文件中的某些数据,在获取yml配置文件数据的时候,进行一下属性数据的校验,比如说bean中的time属性只想接收0-24之间的数字,因此我们就需要通过校验器进行一下校验判断yml配置文件中的time配置名中的数据是否在0-24之间,如果在的话再通过@ConfigurationProperties注解把yml配置文件中的数据封装到time属性中,如果不在就不封装
4.1、实现步骤如下所示:
这两个坐标一个都不能少,第一个是:JSR303校验坐标,第二个是:校验器坐标,


注意:设置校验规则的时候,可以设定很多的规则,这里只展示了最大值,还可以有最小值等

代码演示如下所示:

当yml配置文件中的time数据不超过400的时候:

可以发现确实通过@ConfigurationProperties注解把yml配置文件中的数据封装到bean相对应的属性当中了
当yml配置文件中的数据超过校验规则400的最大400后,会发现再通过@ConfigurationProperties注解也获取不到yml配置文件中的数据也封装不到bean的属性当中了,因为设定规则了,除非yml中的数据在设置的规则内,那么才能把yml配置中的数据封装到我bean的属性中,要不然你就别想了:

边栏推荐
- LINE Verda Programming Contest (AtCoder Beginner Contest 263) A~E 题解
- 华为云全流程护航《流浪方舟》破竹首发,打造口碑爆款
- ceph 创建池和制作块设备基操
- win10 uwp 改变鼠标
- About the common Hook encapsulation of DOM (2)
- win10 uwp 无法附加到CoreCLR
- Prometheus full installation
- Guo Wei (Guo Daxia): Nine Yes or No about open source
- .NET 6 study notes (4) - Solve the Nullable warning in VS2022
- MySQL索引的B+树到底有多高?
猜你喜欢
随机推荐
低代码平台和专业开发人员——完美搭档?
集合框架Collection与Map的区别和基本使用
自学软件测试,学到什么程度可以出去找工作啊?
Discuz! Forum program installation + template configuration tutorial
CPU状态信息us,sy,ni,id,wa,hi,si,st含义
最强分布式锁工具:Redisson
方舟单机/管理员特殊物品指令代码大全
那些关于DOM的常见Hook封装(二)
手写flexible.js的原理实现,我终于明白移动端多端适配
【代码审计】——PHP项目类RCE及文件包含下载删除
虚拟修补:您需要知道的一切
Li Yuanyuan: iMetaLab Suite metaproteomics data analysis and visualization (video + PPT)
OpenCV 轮廓 —— 轮廓匹配
2022秋招面试宝典,啃完面试稳了
The senior told me that the MySQL of the big factory is connected through SSH
Unity webgl 关于适配网页 ,并且用到js中的SetTimeOut和SetInterval()
秋招面试大厂总被刷下来,你这样做保准你事半功倍!
Apache Doris Community PMC Yang Zhengguo: How do open source projects strike a balance between their own and the community's needs?
Logic unauthorized and horizontal and vertical unauthorized payment tampering, verification code bypass, interface
测试开发是什么,为什么现在这么吃香?








