首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Spring - BeanDefinition的注册顺序 & DeffredImportSelector

Spring - BeanDefinition的注册顺序 & DeffredImportSelector

作者头像
小小工匠
发布2021-08-17 10:29:58
发布2021-08-17 10:29:58
4430
举报
文章被收录于专栏:小工匠聊架构小工匠聊架构

文章目录


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

代码语言:javascript
复制
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;
        }
    }



}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/05/20 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • BeanDefinition的注册顺序
  • DeffredImportSelector
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档