概述
ConfigurationProperties
是一个大家常用的注解。有一些系统配置,经常放在yml
中,然后通过spring
注入到bean
中。
一般这些配置都是通过在spring
生命周期的某一个环节,将属性注入进去的。
ConfigurationProperties
就是利用了org.springframework.boot.context.properties.ConfigurationPropertiesBindingPostProcessor
接口在重写的postProcessBeforeInitialization
方法中将yml
中的配置set
到bean
中.(ConfigurationPropertiesBindingPostProcessor
继承了BeanPostProcessor
接口,在Bean
对象实例化和依赖注入完毕后
,在调用初始化方法前
可以添加对应的修改。)
源码流程分析
当前我的springboot
版本是
spring-boot-2.7.4.jar
进入注解源码,果然一开头就看到一个后置处理器。顺藤摸瓜继续点进去,可以看到实现了org.springframework.beans.factory.config.BeanPostProcessor
接口
在org.springframework.boot.context.properties.ConfigurationPropertiesBindingPostProcessor
重写的
postProcessBeforeInitialization
方法中看到了一个关键的bind
方法。
bind
方法的入参是一个org.springframework.boot.context.properties.ConfigurationPropertiesBean
对象。这个ConfigurationPropertiesBean
记录了当前bean
的prefix
前缀。后面会根据这个前缀去读取对应配置,赋值到bean
属性中。
ConfigurationPropertiesBean.get
获取一个ConfigurationPropertiesBean
实例,实例内包含了当前bean
,以及bean
上的ConfigurationProperties
注解信息等
org.springframework.boot.context.properties.ConfigurationPropertiesBinder#bind
绑定属性值到bean里
org.springframework.boot.context.properties.bind.Binder#bindDataObject
循环遍历属性,一个个绑定上去
org.springframework.boot.context.properties.bind.JavaBeanBinder#bind(org.springframework.boot.context.properties.bind.DataObjectPropertyBinder, org.springframework.boot.context.properties.bind.JavaBeanBinder.Bean, org.springframework.boot.context.properties.bind.JavaBeanBinder.BeanSupplier, org.springframework.boot.context.properties.bind.Binder.Context)
获取属性的值set到对象中去
org.springframework.boot.context.properties.bind.JavaBeanBinder#bind(org.springframework.boot.context.properties.bind.JavaBeanBinder.BeanSupplier, org.springframework.boot.context.properties.bind.DataObjectPropertyBinder, org.springframework.boot.context.properties.bind.JavaBeanBinder.BeanProperty)