接上文(),我们已经介绍了部分SpringApplication的启动过程,今天我们将继续讲解如何创建ApplicationContext的过程。
介绍
/**
* 这里我们可以自定义创建过程来覆盖缺省的Context
*/
protected ConfigurableApplicationContext createApplicationContext() {
return this.applicationContextFactory.create(this.webApplicationType);
}
Spring Boot创建ApplicationContext的过程主要为了后面准备和刷新Context,当然我们可以定制这个创建过程,这里我们先介绍Spring Boot的缺省逻辑
static class Factory implements ApplicationContextFactory {
@Override
public ConfigurableApplicationContext create(WebApplicationType webApplicationType) {
// 创建并返回一个AnnotationConfigServletWebServerApplicationContext
return (webApplicationType != WebApplicationType.SERVLET) ? null
: new AnnotationConfigServletWebServerApplicationContext();
}
}
static class Factory implements ApplicationContextFactory {
@Override
public ConfigurableApplicationContext create(WebApplicationType webApplicationType) {
// 创建并返回一个AnnotationConfigReactiveWebServerApplicationContext
return (webApplicationType != WebApplicationType.REACTIVE) ? null
: new AnnotationConfigReactiveWebServerApplicationContext();
}
}
这里会根据应用的类型创建不同的ApplicationContext
,下面我们将主要讲解servlet类型的ApplicationContext,关于Reactive Web Application的部分将在以后单独讲解。
/**
* 创建AnnotationConfigServletWebServerApplicationContext
*/
public AnnotationConfigServletWebServerApplicationContext() {
this.reader = new AnnotatedBeanDefinitionReader(this);
this.scanner = new ClassPathBeanDefinitionScanner(this);
}
从上面的代码可以看出创建ApplicationContext的过程主要有两部分,我们将逐一讲解。
创建AnnotatedBeanDefinitionReader
/**
* 创建一个新的AnnotatedBeanDefinitionReader,如果这个registry是EnvironmentCapable的子类,
* 比如是一个ApplicationContext,那么Environment将从这个ApplicationContext继承
*/
public AnnotatedBeanDefinitionReader(BeanDefinitionRegistry registry) {
this(registry, getOrCreateEnvironment(registry));
}
这里的registry就是AnnotationConfigServletWebServerApplicationContext本身, 因为AnnotationConfigServletWebServerApplicationContext是新创建的,所有getOrCreateEnvironment(registry)返回的一定是一个新的StandardEnvironment。而将之前创建的Environment注入到这里是在准备ApplicationContext阶段进行的。