关于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代码流程,主要是容器的启动