一切从SpringApplication.run()开始,最终返回一个ConfigurableApplicationContext
构造了一个SpringApplication对象,然后调用它的run方法。下面看下构造方法都做了什么
1、推断Web应用类型(WebApplicationType),本例中是SERVLET
2、设置 Bootstrapper、ApplicationContextInitializer 和 ApplicationListener
3、推断main方法
注意到,在设置 Bootstrapper、ApplicationContextInitializer 和 ApplicationListener 时,都调用了同一个方法getSpringFactoriesInstances
从所有 META-INF/spring.factories 文件中加载,并查找指定名称的的值
回到之前的构造方法那里,现在我们知道设置的Bootstrapper、ApplicationContextInitializer、ApplicationListener是从哪儿来的了,原来是在META-INF/spring.factories中配置的。查找指定key对应的值,然后实例化它们,并返回一个List
接下来,重头戏,调用run方法
重点看try里面的内容
首先是启动监听器来监听启动过程,这里再一次调用了熟悉的getSpringFactoriesInstances
然后,将main方法中传的参数包装成ApplicationArguments对象
紧接着,创建并配置环境,返回一个ConfigurableEnvironment对象,由于本例中是SERVLET,所以创建的是StandardServletEnvironment
然后,打印Banner
创建ApplicationContext,所有基于Spring的项目启动过程都是创建ApplicationContext
这里创建的ConfigurableApplicationContext是AnnotationConfigServletWebServerApplicationContext
有了ApplicationContext,紧接着要配置ApplicationContext
加载所有的source(其实就是class),然后实例化
这里就是一个,就是启动类
接下来,刷新容器