springboot启动(四)——refreshContext之invokeBeanFactoryPostProcessors方法作用

关于refresh和spring基本一致,之前的spring模块已有分析,此次只分析部分点

refresh方法源代码

protected void refresh(ApplicationContext applicationContext) {
		Assert.isInstanceOf(AbstractApplicationContext.class, applicationContext);
		((AbstractApplicationContext) applicationContext).refresh();
	}

在这里插入图片描述

001、invokeBeanFactoryPostProcessors

调用委托类方法
PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, this.getBeanFactoryPostProcessors());

首先获取到BeanDefinitionRegistryPostProcessor类型的后置处理器的name
在这里插入图片描述
然后调用后置处理器方法
invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);

在这里插入图片描述

整个类之前在spring文章中分析了,主要是用于加载所有的bean的定义信息
在这里插入图片描述
下面看下这个processConfigBeanDefinitons方法

1、获取所有已加载的bean的定义信息集合

在这里插入图片描述
注意:springboot启动的入口类此时也在

2、查找这些bean的定义信息中的配置类

在这里插入图片描述

3、解析配置类 parser.parse(candidates)

在这里插入图片描述
在这里插入图片描述
进入方法this.doProcessConfigurationClass(configClass, sourceClass);

protected final ConfigurationClassParser.SourceClass doProcessConfigurationClass(ConfigurationClass configClass, ConfigurationClassParser.SourceClass sourceClass) throws IOException {
        this.processMemberClasses(configClass, sourceClass);
        Iterator var3 = AnnotationConfigUtils.attributesForRepeatable(sourceClass.getMetadata(), PropertySources.class, PropertySource.class).iterator();

        AnnotationAttributes importResource;
        while(var3.hasNext()) {
            importResource = (AnnotationAttributes)var3.next();
            if (this.environment instanceof ConfigurableEnvironment) {
                this.processPropertySource(importResource);
            } else {
               
            }
        }
		//获取componentScan注解属性
        Set<AnnotationAttributes> componentScans = AnnotationConfigUtils.attributesForRepeatable(sourceClass.getMetadata(), ComponentScans.class, ComponentScan.class);
        if (!componentScans.isEmpty() && !this.conditionEvaluator.shouldSkip(sourceClass.getMetadata(), ConfigurationPhase.REGISTER_BEAN)) {
            Iterator var13 = componentScans.iterator();

            while(var13.hasNext()) {
                AnnotationAttributes componentScan = (AnnotationAttributes)var13.next();
                //调用parse方法
                Set<BeanDefinitionHolder> scannedBeanDefinitions = this.componentScanParser.parse(componentScan, sourceClass.getMetadata().getClassName());
                Iterator var7 = scannedBeanDefinitions.iterator();

                while(var7.hasNext()) {
                    BeanDefinitionHolder holder = (BeanDefinitionHolder)var7.next();
                    if (ConfigurationClassUtils.checkConfigurationClassCandidate(holder.getBeanDefinition(), this.metadataReaderFactory)) {
                        this.parse(holder.getBeanDefinition().getBeanClassName(), holder.getBeanName());
                    }
                }
            }
        }
        ...

在这里插入图片描述
如果没有设置包路径,则默认使用当前入口类所在项目路径作为包扫描默认路径

下节将看下002代码流程,主要是容器的启动

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值