记录下SpringMVC容器以注解的方式加载Bean的堆栈调用,做个笔记,其中一些更深层次的内容以后再探究:
1、SpringApplication类
public static ConfigurableApplicationContext run(Class<?>[] primarySources, String[] args)方法的:
return (new SpringApplication(primarySources)).run(args)
2、SpringApplication类
ConfigurableApplicationContext run(String... args) 方法的:
this.refreshContext(context);
3、SpringApplication类
private void refreshContext(ConfigurableApplicationContext context)的
this.refresh(context);
4、SpringApplication类
protected void refresh(ApplicationContext applicationContext)的
((AbstractApplicationContext)applicationContext).refresh();
5、AbstractApplicationContext类
public void refresh() throws BeansException, IllegalStateException 的
this.invokeBeanFactoryPostProcessors(beanFactory);
// this.postProcessBeanFactory(beanFactory);
// this.invokeBeanFactoryPostProcessors(beanFactory);
// this.registerBeanPostProcessors(beanFactory);
// this.initMessageSource();
// this.initApplicationEventMulticaster();
// this.onRefresh();
// this.registerListeners();
// this.finishBeanFactoryInitialization(beanFactory);
// this.finishRefresh();
其中this.finishBeanFactoryInitialization(beanFactory)完成在this.invokeBeanFactoryPostProcessors(beanFactory)加载的Beandefinition的实例化
6、AbstractApplicationContext类
protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory)的
PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, this.getBeanFactoryPostProcessors());
7、PostProcessorRegistrationDelegate类
public static void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors)的:
invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
8、PostProcessorRegistrationDelegate类
private static void invokeBeanDefinitionRegistryPostProcessors(Collection<? extends BeanDefinitionRegistryPostProcessor> postProcessors, BeanDefinitionRegistry registry)的:
postProcessor.postProcessBeanDefinitionRegistry(registry);
9、ConfigurationClassPostProcessor类
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry)的
this.processConfigBeanDefinitions(registry);
10、ConfigurationClassPostProcessor类
public void processConfigBeanDefinitions(BeanDefinitionRegistry registry) 的:
parser.parse(candidates);
11、ConfigurationClassParser类
public void parse(Set<BeanDefinitionHolder> configCandidates)的
if(bd instanceof AnnotatedBeanDefinition) {
this.parse(((AnnotatedBeanDefinition)bd).getMetadata(), holder.getBeanName());
}
12、ConfigurationClassParser类
protected final void parse(AnnotationMetadata metadata, String beanName) throws IOException
this.processConfigurationClass(new ConfigurationClass(metadata, beanName));
13、ConfigurationClassParser类
sourceClass = this.doProcessConfigurationClass(configClass, sourceClass);
14、ConfigurationClassParser类
Set<BeanDefinitionHolder> scannedBeanDefinitions = this.componentScanParser.parse(componentScan, sourceClass.getMetadata().getClassName());
15、ComponentScanAnnotationParser类
return scanner.doScan(StringUtils.toStringArray(basePackages));
16、ClassPathBeanDefinitionScanner类
Set<BeanDefinition> candidates = this.findCandidateComponents(basePackage);
17、ClassPathScanningCandidateComponentProvider类
this.scanCandidateComponents(basePackage);
18、ClassPathScanningCandidateComponentProvider类
private Set<BeanDefinition> scanCandidateComponents(String basePackage) {
LinkedHashSet candidates = new LinkedHashSet();
try {
String packageSearchPath = "classpath*:" + this.resolveBasePackage(basePackage) + '/' + this.resourcePattern;
Resource[] resources = this.getResourcePatternResolver().getResources(packageSearchPath);
boolean traceEnabled = this.logger.isTraceEnabled();
boolean debugEnabled = this.logger.isDebugEnabled();
Resource[] var7 = resources;
int var8 = resources.length;
for(int var9 = 0; var9 < var8; ++var9) {
Resource resource = var7[var9];
if(traceEnabled) {
this.logger.trace("Scanning " + resource);
}
if(resource.isReadable()) {
try {
MetadataReader metadataReader = this.getMetadataReaderFactory().getMetadataReader(resource);
if(this.isCandidateComponent(metadataReader)) {
ScannedGenericBeanDefinition sbd = new ScannedGenericBeanDefinition(metadataReader);
sbd.setResource(resource);
sbd.setSource(resource);
if(this.isCandidateComponent((AnnotatedBeanDefinition)sbd)) {
if(debugEnabled) {
this.logger.debug("Identified candidate component class: " + resource);
}
candidates.add(sbd);
} else if(debugEnabled) {
this.logger.debug("Ignored because not a concrete top-level class: " + resource);
}
} else if(traceEnabled) {
this.logger.trace("Ignored because not matching any filter: " + resource);
}
} catch (Throwable var13) {
throw new BeanDefinitionStoreException("Failed to read candidate component class: " + resource, var13);
}
} else if(traceEnabled) {
this.logger.trace("Ignored because not readable: " + resource);
}
}
return candidates;
} catch (IOException var14) {
throw new BeanDefinitionStoreException("I/O failure during classpath scanning", var14);
}
}