前言
用法
- 定义一个与application.yml中属性配置相对应的实体类,比如ServerProperties
- 在ServerProperties中添加@ConfigurationProperties注解,指定prefix
- 在@Configuration配置类中添加@EnableConfigurationProperties(ServerProperties.class)
- 使用方式,可以透过@Bean方法中的入参或者在Spring Bean中用@Autowired注解都可以。
原理
解析@Configuration类
找到该类通过@Import所引入的类,对于@EnableConfigurationProperties来说,引入的是EnableConfigurationPropertiesRegistrar。
在loadBeanDefinitionsFromConfiguration中向IOC容器中注册有关的beanDefinition信息。
对于@EnableConfigurationProperties来说,向IOC容器实际注册beanDefinition是通过
loadBeanDefinitionsFromRegistrars(configClass.getImportBeanDefinitionRegistrars());
来实现的,即完成EnableConfigurationPropertiesRegistrar这个类的BeanDefinition信息的注册。
// EnableConfigurationPropertiesRegistrar该类下重载的方法
@Override
public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {
// 注册该类的基础BeanDefinition信息
registerInfrastructureBeans(registry);
// 创建特定Bean的注册器,以便将通过注解引入的用户自定义类注册到IOC容器中
ConfigurationPropertiesBeanRegistrar beanRegistrar = new ConfigurationPropertiesBeanRegistrar(registry);
// 获取@EnableConfigurationProperties注解引入的类,进行注册
getTypes(metadata).forEach(beanRegistrar::register);
}
// 注册需要的基础设置类
static void registerInfrastructureBeans(BeanDefinitionRegistry registry) {
// Bean对象创建后置处理BeanPostProcessor
// 处理比如ServerProperties这种
ConfigurationPropertiesBindingPostProcessor.register(registry);
// 绑定的beanDefinition注册
BoundConfigurationProperties.register(registry);
// 配置Bean工厂元数据的注册
ConfigurationBeanFactoryMetadata.register(registry);
}
以SpringBoot提供的ServerProperties为例:
当在创建ServerProperties对象时,在bean生命周期的initializeBean
的postProcessBeforeInitialization
由ConfigurationPropertiesBindingPostProcessor
起作用。
通过ConfigurationProperties annotation = findAnnotation(instance, type, factory, ConfigurationProperties.class);
找到ServerProperties类上的注解@ConfigurationProperties。
通过bind方法绑定