Spring - BeanDefinition的注册顺序 & DeffredImportSelector

举报
小工匠 发表于 2021/09/10 01:23:05 2021/09/10
【摘要】 文章目录 BeanDefinition的注册顺序DeffredImportSelector BeanDefinition的注册顺序 首先是 @ComponentScan扫描: @C...

在这里插入图片描述


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;
        }
    }



}


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56

文章来源: artisan.blog.csdn.net,作者:小小工匠,版权归原作者所有,如需转载,请联系作者。

原文链接:artisan.blog.csdn.net/article/details/117093806

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。