环境:SpringBoot3.2.5
1. 简介
本篇文章将介绍Spring Boot中一个非常强大且十分重要的类Binder,该类可以将外部配置文件的属性值绑定到Spring Boot应用程序中的Java对象上。在Spring Boot中,通常使用@ConfigurationProperties
注解来指定外部配置文件中的属性前缀,并使用Binder的bind
方法将配置值绑定到Java对象上。这样,Spring Boot应用程序可以方便地读取和使用配置文件中的属性配置。
2. 实战案例
2.1 准备绑定对象
配置文件中添加配置属性
测试绑定组件
后续案例都将基于上面的环境
2.2 基础绑定
在该示例中,配置文件中的age属性能正确的转换为Integer。为什么能进行数据类型转换?因为内部(调用Binder#get(env)时)会添加TypeConverterConversionService和ApplicationConversionService两个类型转换器。
2.3 自定义数据类型转换
给Person添加Date类型的字段,如下:
在此执行上面2.2中代码,程序抛出了如下异常
图片
默认的数据类型转换器是没有String到Date转换功能。我们需要添加自定义的类型转换,如下自定义类型转换器:
修改数据绑定方式
这次成功输出结果。
2.4 数据绑定回调
我们还可以为Binder执行绑定时,传入回调句柄,这样在数据绑定的各个阶段都可以进行相应的处理,如下示例:
输出结果
图片
每个属性在绑定时都会执行相应的回调方法。
3. 都用在哪里?
在SpringBoot环境中所有的数据绑定功能都是通过Binder进行。下面列出几个非常重要的地方
3.1 SpringBoot启动时绑定SpringApplication
SpringBoot在启动时初始化环境配置Environment时,会将配置文件中的spring.main.*下的配置属性绑定到当前的SpringApplication对象上。
spring.main有如下配置:
图片
3.2 绑定使用@ConfigurationProperties类
@ConfigurationProperties注解的类是通过BeanPostProcessor处理器执行绑定(不管是类上使用该注解,还是@Bean注解的方法都是通过该处理器进行绑定)。
上面的ConfigurationPropertiesBean.get方法会处理当前bean实例是独立的一个Bean对象且类上有@ConfigurationProperties注解,或者是当前的bean实例是通过@Bean定义且方法上有@ConfigurationProperties注解。不管是哪种定义的bean只要满足条件,都会被包装成ConfigurationPropertiesBean对象。接下来执行bind方法:
执行绑定
以上就是@ConfigurationProperties注解的类或方法对象通过Binder绑定的原理。
3.3 SpringCloud Gateway绑定路由谓词&过滤器
当一个路由请求过来时,会查询相应的路由,而这个查找过程中就会通过路由的定义信息转换为Route对象。以下是大致过程(详细还需要自行阅读源码)
以上源码比较粗略,大家只要知道原理即可,没必要任何一个点都搞的清清楚楚。