文章目录
- BeanDefinition的注册顺序
- DeffredImportSelector
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;
}
}
}