概述
在Spring中,如果想基于一个给定的选择标准(selection criteria),比如一个或者多个注解属性导入一些配置类(使用@Configuration的那些类),某个bean注册器,可以实现接口ImportSelector来实现这样的逻辑。
一个ImportSelector实现类通常也可能会实现各种Aware接口,如果实现了这些Aware接口,这些接口方法的调用会发生在selectImports之前。
ImportSelector#selectImports的调用在ConfigurationClassParser#processImports中。
实现类举例:
AutoConfigurationImportSelectorSpringboot用于从所有jar包的META-INF/spring.factories文件中加载所有的自动配置类:key为org.springframework.boot.autoconfigure.EnableAutoConfiguration的项。SessionAutoConfiguration$SessionConfigurationImportSelector根据当前
Web环境类型决定启用哪个Session配置类。
一个ImportSelector通常被@Import注解使用,如下所示 :
//...
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
//...
}
ImportSelector#selectImports 返回的树组的元素的类型可以是以下三种情况之一 :
ImportSelector(也就是说,一个ImportSelector可以导入另外一个ImportSelector)ImportBeanDefinitionRegistrar- 某个配置类
源代码解析
package org.springframework.context.annotation;
import org.springframework.core.type.AnnotationMetadata;
public interface ImportSelector {
/**
* Select and return the names of which class(es) should be imported based on
* the AnnotationMetadata of the importing @Configuration class.
*
* 这里importingClassMetadata是使用@Import注解导入该ImportSelector
* 的配置类的注解元数据。实现类可以实现该方法,根据导入类的注解元数据
* 也就是importingClassMetadata,当然也可以结合考虑当前环境中的其他信息,
* 决定导入哪些配置类。
*/
String[] selectImports(AnnotationMetadata importingClassMetadata);
}
本文深入解析Spring框架中ImportSelector接口的作用及其实现原理,展示如何通过实现此接口按选择标准导入配置类,介绍AutoConfigurationImportSelector和SessionAutoConfiguration$SessionConfigurationImportSelector两个典型实现案例。
1304

被折叠的 条评论
为什么被折叠?



