直接从上一篇Spring源码解析之@Configuration @Bean源码继续
启动类
我们从spring-boot启动类进入源码,自动装配从这里开始
进入run方法
run方法走进来,经过了SpringApplication的构造函数以后,进入上图的run方法。
这个run方法不是今天的重点,所以简单介绍一下。
run方法主要是做环境准备,打印banner,注册Listener等工作。
我们直接进入refreshContext方法。
可以看到跟进来以后,走到了refresh模版方法,这也是spring源码里最关键的一个方法了,spring xml管理bean也是从refresh开始的,所以我们还可以知道,spring-boot最后也是走到refresh去完成升级的。
然后我们直接进入invokeBeanFactoryPostProcessors(beanFactory)方法
再进入PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors());
再跟进
invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
进入ConfigurationClassPostProcessor实现
然后我们进入processConfigBeanDefinitions(registry);
然后我们进入parser.parse(candidates);
然后我们看三个parse方法,和parse内调用的processConfigurationClass(new ConfigurationClass(reader, beanName));
众所周知Spring源码的风格有一个特点,真正干事情的就是do Prefix Method。
所以我们进入sourceClass = doProcessConfigurationClass(configClass, sourceClass);
好,我们直接进入
processImports(configClass, sourceClass, getImports(sourceClass), true);
分别是三种处理
1.如果实现了ImportSelector接口
2.如果实现了ImportBeanDefinitionRegistrar接口
3.如果就是@Import当@COnfiguration用
其余的就不赘述了,和上篇一致~
网友评论