0
点赞
收藏
分享

微信扫一扫

Spring - BeanDefinition的注册顺序 & DeffredImportSelector

爱读书的歌者 2022-02-10 阅读 42



文章目录


  • ​​BeanDefinition的注册顺序​​
  • ​​DeffredImportSelector​​


Spring - BeanDefinition的注册顺序 &  DeffredImportSelector_DeffredImport

BeanDefinition的注册顺序


  1. 首先是 @ComponentScan扫描: @Component @Service @Controller
  2. @Import的 @Component @Service @Controller
  3. @Configuration 和 该配置类里面的Bean -----> 该配置类里面的@Import进来的实现类
  4. @Import进来的@Configuration 和 该配置类里面的@Bean -----> 该配置类里面的@Import进来的实现类
  5. @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;
}
}



}



举报

相关推荐

0 条评论