BeanDefinition的注册顺序
首先是 @ComponentScan扫描: @Component @Service @Controller
@Import的 @Component @Service @Controller
@Configuration 和 该配置类里面的Bean -----> 该配置类里面的@Import进来的实现类
@Import进来的@Configuration 和 该配置类里面的@Bean -----> 该配置类里面的@Import进来的实现类
@Import进来的实现了DeffredImportSelector接口的@Configuration ----> 和 该配置类里面的@Bean -----> 该配置类里面的@Import进来的实现了@ImportBeanDefinitionRegistrar接口
DeffredImportSelector 是Spring Boot 自动装配原理中不可获取的一部分, 实现了 延迟 + 分组
DeffredImportSelector
import org.springframework.context.annotation.DeferredImportSelector; import org.springframework.core.type.AnnotationMetadata; import java.util.ArrayList; import java.util.List; import java.util.function.Predicate; /*** * 延迟 特性, 分组特性 */ public class MyDeferredImportSelector implements DeferredImportSelector { @Override public String[] selectImports(AnnotationMetadata importingClassMetadata) { return new String[]{"com.artisan.beans.Person"}; } @Override public Predicate<String> getExclusionFilter() { return null; } @Override public Class<? extends Group> getImportGroup() { // 这个返回值决定调用DeferredImportSelector.selectImports 如果null // 还是调用Group.selectImports return MyGroup.class; } // 如果getImportGroup返回自定义Group , 会调用自定义Group的process方法 // 如果getImportGroup返回 null,会调用DefaultDeferredImportSelectorGroup的process方法,即调用selectImports // 分组利用归类,同一组的bean只影响本组的顺序 private static class MyGroup implements DeferredImportSelector.Group{ AnnotationMetadata metadata; @Override public void process(AnnotationMetadata metadata, DeferredImportSelector selector) { this.metadata=metadata; } // 实现 分组 @Override public Iterable<Entry> selectImports() { List<Entry> list=new ArrayList<>(); list.add(new Entry(this.metadata,"com.artisan.beans.Person")); return list; } } }
