run()中
context = createApplicationContext();
然后继续跟进代码
protected ConfigurableApplicationContext createApplicationContext() {
Class<?> contextClass = this.applicationContextClass;
if (contextClass == null) {
try {
switch (this.webApplicationType) {
case SERVLET:
contextClass = Class.forName(DEFAULT_SERVLET_WEB_CONTEXT_CLASS);
break;
case REACTIVE:
contextClass = Class.forName(DEFAULT_REACTIVE_WEB_CONTEXT_CLASS);
break;
default:
contextClass = Class.forName(DEFAULT_CONTEXT_CLASS);
}
}
catch (ClassNotFoundException ex) {
throw new IllegalStateException(
"Unable create a default ApplicationContext, please specify an ApplicationContextClass", ex);
}
}
return (ConfigurableApplicationContext) BeanUtils.instantiateClass(contextClass);
}
因为我们是SERVLET应用程序,所以会执行
contextClass = Class.forName(DEFAULT_SERVLET_WEB_CONTEXT_CLASS)得到Class/**
public static final String DEFAULT_SERVLET_WEB_CONTEXT_CLASS = "org.springframework.boot." + "web.servlet.context.AnnotationConfigServletWebServerApplicationContext";/
(ConfigurableApplicationContext) BeanUtils.instantiateClass(contextClass);实例化对象AnnotationConfigServletWebServerApplicationContext
1.其中AnnotationConfigServletWebServerApplicationContext在实例化对象的时候,执行默认的构造器,创建了
public AnnotationConfigServletWebServerApplicationContext() { this.reader = new AnnotatedBeanDefinitionReader(this); this.scanner = new ClassPathBeanDefinitionScanner(this); }
2.
看上面的类图,在实例化AnnotationConfigServletWebServerApplicationContext对象的时候,首先会实现父类的对象
private final DefaultListableBeanFactory beanFactory;public GenericApplicationContext() { this.beanFactory = new DefaultListableBeanFactory(); }
所以很明显的我们可以看出,在创建AnnotationConfigServletWebServerApplicationContext对象的时候,其里面也默默的做了很多的事情,把DefaultListableBeanFactory容器实例化出来给了AnnotationConfigServletWebServerApplicationContext的属性