Spring DeferredImportSelector类解析
目录
前言
DeferredImportSelector这个类可能很多人都没见过, 实在是他不常用,而且用起来麻烦,不过他也很重要,在springboot里,他承担了自动装配这样的重要任务,想要了解自动装配原理最好还是先看看spring是如何对DeferredImportSelector这个类进行解析的
一、DeferredImportSelector结构
public interface DeferredImportSelector extends ImportSelector {
// 要使用DeferredImportSelector 就要实现下面的getImportGroup方法,并要写一个实现Group接口的 类,该方法返回一个Class,
//表示当前DeferredImportSelector 属于哪个组的,spring会生成唯一的Group,并将返回值为该Group的DeferredImportSelector 放入一个List里
@Nullable
default Class<? extends Group> getImportGroup() {
return null;
}
DeferredImportSelector 继承自ImportSelector 接口, 但却并未实现其selectImports方法, 对DeferredImportSelector 子类也不会调用该方法
Group 是DeferredImportSelector 的内部一个接口
interface Group {
//上面分组完成后spring会调用该方法,循环List里的DeferredImportSelector 类,并循环调用process方法
//AnnotationMetadata :当前循环的DeferredImportSelector 的导入配置类(当前@Import注解的类)
void process(AnnotationMetadata metadata, DeferredImportSelector selector);
//每个Group只执行一次,返回一个迭代器,spring会使用迭代器的forEach方法进行迭代,
//想要导入spting容器的类要封装成Entry对象,且返回的对象不能为null,会报错(设计问题)
Iterable<Entry> selectImports();
Entry 是Group 的一个内部类
class Entry {
private final AnnotationMetadata metadata;
private final String importClassName;
//AnnotationMetadata :必须是一个将DeferredImportSelector 导入的配置类,要不会报错,而且不能new
//importClassName:需要导入类的类路径名
public Entry(AnnotationMetadata metadata, String importClassName) {
this.metadata = metadata;
this.importClassName = importClassName;
}
public AnnotationMetadata getMetadat