
接上文,这里从refreshContext(context)开始读
1、refreshContext(context) protected void refresh(ApplicationContext applicationContext) {
Assert.isInstanceOf(AbstractApplicationContext.class, applicationContext);
((AbstractApplicationContext) applicationContext).refresh();
}
2、AbstractApplicationContext.refresh()
invokeBeanFactoryPostProcessors(beanFactory);3、invokeBeanFactoryPostProcessors(beanFactory)
protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) {
PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors());
// Detect a LoadTimeWeaver and prepare for weaving, if found in the meantime
// (e.g. through an @Bean method registered by ConfigurationClassPostProcessor)
if (beanFactory.getTempClassLoader() == null && beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) {
beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory));
beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));
}
}
4、PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors());
invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
private static void invokeBeanDefinitionRegistryPostProcessors(
Collection extends BeanDefinitionRegistryPostProcessor> postProcessors, BeanDefinitionRegistry registry) {
for (BeanDefinitionRegistryPostProcessor postProcessor : postProcessors) {
postProcessor.postProcessBeanDefinitionRegistry(registry);
}
}
5、ConfigurationClassPostProccessor.postProcessBeanDefinitionRegistry
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) {
int registryId = System.identityHashCode(registry);
if (this.registriesPostProcessed.contains(registryId)) {
throw new IllegalStateException(
"postProcessBeanDefinitionRegistry already called on this post-processor against " + registry);
}
if (this.factoriesPostProcessed.contains(registryId)) {
throw new IllegalStateException(
"postProcessBeanFactory already called on this post-processor against " + registry);
}
this.registriesPostProcessed.add(registryId);
processConfigBeanDefinitions(registry);
}
6、 ConfigurationClassPostProccessor.processConfigBeanDefinitions
bd instanceof AnnotatedBeanDefinition
parser.parse(candidates);
public void parse(SetconfigCandidates) { for (BeanDefinitionHolder holder : configCandidates) { BeanDefinition bd = holder.getBeanDefinition(); try { if (bd instanceof AnnotatedBeanDefinition) { parse(((AnnotatedBeanDefinition) bd).getmetadata(), holder.getBeanName()); } else if (bd instanceof AbstractBeanDefinition && ((AbstractBeanDefinition) bd).hasBeanClass()) { parse(((AbstractBeanDefinition) bd).getBeanClass(), holder.getBeanName()); } else { parse(bd.getBeanClassName(), holder.getBeanName()); } } catch (BeanDefinitionStoreException ex) { throw ex; } catch (Throwable ex) { throw new BeanDefinitionStoreException( "Failed to parse configuration class [" + bd.getBeanClassName() + "]", ex); } } this.deferredimportSelectorHandler.process(); }
7、 ConfigurationClassParser.parse()
protected final void parse(Annotationmetadata metadata, String beanName) throws IOException {
processConfigurationClass(new ConfigurationClass(metadata, beanName));
}
8、ConfigurationClassParser.processConfigurationClass(configClass)
do {
sourceClass = doProcessConfigurationClass(configClass, sourceClass);
}
while (sourceClass != null);
9、ConfigurationClassParser.doProcessConfigurationClass(configClass, sourceClass)
// Process any @import annotations processimports(configClass, sourceClass, getimports(sourceClass), true);
getimports(sourceClass)
private Setgetimports(SourceClass sourceClass) throws IOException { Set imports = new linkedHashSet<>(); Set visited = new linkedHashSet<>(); collectimports(sourceClass, imports, visited); return imports; }
private void collectimports(SourceClass sourceClass, Setimports, Set visited) throws IOException { if (visited.add(sourceClass)) { for (SourceClass annotation : sourceClass.getAnnotations()) { String annName = annotation.getmetadata().getClassName(); if (!annName.equals(import.class.getName())) { collectimports(annotation, imports, visited); } } imports.addAll(sourceClass.getAnnotationAttributes(import.class.getName(), "value")); } }
这里就扫描到了全部带有@import注解的类,再回到ConfigurationClassParser.parse(configCandidates),最后一行this.deferredimportSelectorHandler.process();
public void parse(SetconfigCandidates) { for (BeanDefinitionHolder holder : configCandidates) { BeanDefinition bd = holder.getBeanDefinition(); try { if (bd instanceof AnnotatedBeanDefinition) { parse(((AnnotatedBeanDefinition) bd).getmetadata(), holder.getBeanName()); } else if (bd instanceof AbstractBeanDefinition && ((AbstractBeanDefinition) bd).hasBeanClass()) { parse(((AbstractBeanDefinition) bd).getBeanClass(), holder.getBeanName()); } else { parse(bd.getBeanClassName(), holder.getBeanName()); } } catch (BeanDefinitionStoreException ex) { throw ex; } catch (Throwable ex) { throw new BeanDefinitionStoreException( "Failed to parse configuration class [" + bd.getBeanClassName() + "]", ex); } } this.deferredimportSelectorHandler.process(); }
10、ConfigurationClassParser.process()进入方法handler.processGroupimports()
public void process() {
List deferredimports = this.deferredimportSelectors;
this.deferredimportSelectors = null;
try {
if (deferredimports != null) {
DeferredimportSelectorGroupingHandler handler = new DeferredimportSelectorGroupingHandler();
deferredimports.sort(DEFERRED_import_COMPARATOR);
deferredimports.forEach(handler::register);
handler.processGroupimports();
}
}
finally {
this.deferredimportSelectors = new ArrayList<>();
}
}
11、ConfigurationClassParser.processGroupimports(),然后进入grouping.getimports()
public void processGroupimports() {
for (DeferredimportSelectorGrouping grouping : this.groupings.values()) {
grouping.getimports().forEach(entry -> {
ConfigurationClass configurationClass = this.configurationClasses.get(
entry.getmetadata());
try {
processimports(configurationClass, asSourceClass(configurationClass),
asSourceClasses(entry.getimportClassName()), false);
}
catch (BeanDefinitionStoreException ex) {
throw ex;
}
catch (Throwable ex) {
throw new BeanDefinitionStoreException(
"Failed to process import candidates for configuration class [" +
configurationClass.getmetadata().getClassName() + "]", ex);
}
});
}
}
12、ConfigurationClassParser.getimports() 然后进入this.group.process(deferredimport.getConfigurationClass().getmetadata(), deferredimport.getimportSelector());
public Iterablegetimports() { for (DeferredimportSelectorHolder deferredimport : this.deferredimports) { this.group.process(deferredimport.getConfigurationClass().getmetadata(), deferredimport.getimportSelector()); } return this.group.selectimports(); }
13、AutoConfigurationimportSelector.process(Annotationmetadata annotationmetadata, DeferredimportSelector deferredimportSelector),然后进入AutoConfigurationimportSelector.getAutoConfigurationEntry(getAutoConfigurationmetadata(), annotationmetadata);
@Override
public void process(Annotationmetadata annotationmetadata, DeferredimportSelector deferredimportSelector) {
Assert.state(deferredimportSelector instanceof AutoConfigurationimportSelector,
() -> String.format("only %s implementations are supported, got %s",
AutoConfigurationimportSelector.class.getSimpleName(),
deferredimportSelector.getClass().getName()));
AutoConfigurationEntry autoConfigurationEntry = ((AutoConfigurationimportSelector) deferredimportSelector)
.getAutoConfigurationEntry(getAutoConfigurationmetadata(), annotationmetadata);
this.autoConfigurationEntries.add(autoConfigurationEntry);
for (String importClassName : autoConfigurationEntry.getConfigurations()) {
this.entries.putIfAbsent(importClassName, annotationmetadata);
}
}
14、AutoConfigurationimportSelector.getAutoConfigurationEntry(AutoConfigurationmetadata autoConfigurationmetadata, Annotationmetadata annotationmetadata),然后进入方法getCandidateConfigurations(annotationmetadata, attributes)
protected AutoConfigurationEntry getAutoConfigurationEntry(AutoConfigurationmetadata autoConfigurationmetadata,
Annotationmetadata annotationmetadata) {
if (!isEnabled(annotationmetadata)) {
return EMPTY_ENTRY;
}
AnnotationAttributes attributes = getAttributes(annotationmetadata);
List configurations = getCandidateConfigurations(annotationmetadata, attributes);
configurations = removeDuplicates(configurations);
Set exclusions = getExclusions(annotationmetadata, attributes);
checkExcludedClasses(configurations, exclusions);
configurations.removeAll(exclusions);
configurations = filter(configurations, autoConfigurationmetadata);
fireAutoConfigurationimportEvents(configurations, exclusions);
return new AutoConfigurationEntry(configurations, exclusions);
}
15、在AutoConfigurationimportSelector.getCandidateConfigurations方法中会从spring.factories文件中加载key值为EnableAutoConfiguration 的配置类
protected ListgetCandidateConfigurations(Annotationmetadata metadata, AnnotationAttributes attributes) { List configurations = SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(), getBeanClassLoader()); Assert.notEmpty(configurations, "No auto configuration classes found in meta-INF/spring.factories. If you " + "are using a custom packaging, make sure that file is correct."); return configurations; }
到这里springBoot自动装配的代码就跟完了