概述
在Spring
中,配置类(使用@Configuration
的那些类)可以使用@Import
直接导入另外一个配置类,也可以导入一个ImportSelector
实现类根据特定的选择条件导入符合条件的配置类,也可以实现该接口ImportBeanDefinitionRegistrar
根据特定条件程序化地直接注册bean
定义到容器。
一个ImportBeanDefinitionRegistrar
实现类通常也可能会实现各种Aware
接口,如果实现了这些Aware
接口,这些接口方法的调用会发生在registerBeanDefinitions
之前。
ImportBeanDefinitionRegistrar#registerBeanDefinitions
的调用在ConfigurationClassBeanDefinitionReader#loadBeanDefinitionsFromRegistrars
中。
ImportBeanDefinitionRegistrar
实现类举例 :
-
DataSourceInitializationConfiguration$Registrar
向容器注册一个名称为
dataSourceInitializerPostProcessor
的基础设施GenericBeanDefinition
。 -
DataSourceInitializedPublisher$Registrar
向容器注册一个名称为
dataSourceInitializedPublisher
的基础设施GenericBeanDefinition
。 -
FeignClientsRegistrar
向容器注册所有
feign
客户端的缺省配置bean
定义,每个feign
客户端的配置bean
定义,以及每个feign
客户端bean
定义。
一个ImportBeanDefinitionRegistrar
通常被@Import
注解使用,如下所示:
//...
@Import(FeignClientsRegistrar.class)
public @interface EnableFeignClients {
//...
}
源代码解析
package org.springframework.context.annotation;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor;
import org.springframework.core.type.AnnotationMetadata;
public interface ImportBeanDefinitionRegistrar {
/**
* Register bean definitions as necessary based on the given annotation metadata of
* the importing @Configuration class.
* Note that BeanDefinitionRegistryPostProcessor types may not be
* registered here, due to lifecycle constraints related to @Configuration
* class processing.
* 基于导入该ImportBeanDefinitionRegistrar的配置类的注解元数据按需求注册bean定义到
* 容器。
* 注意这里不能注册BeanDefinitionRegistryPostProcessor类型的bean定义,原因是
* 这跟配置类的生命周期机制有冲突。
*
* @param importingClassMetadata annotation metadata of the importing class
* @param registry current bean definition registry
*/
public void registerBeanDefinitions(
AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry);
}
相关文章
基于Java配置的Spring应用中如何导入更多的bean定义配置
Spring 概念模型接口 ImportSelector : 配置类导入选择器