1、SpringApplication new一个对象会优先调用initialize方法
public SpringApplication(Object... sources) {initialize(sources); }
private void initialize(Object[] sources) {//添加配置类@SpringBootApplicationif (sources != null && sources.length > 0) {this.sources.addAll(Arrays.asList(sources));}//判断是不是运行在web环境中this.webEnvironment = deduceWebEnvironment();//从spring.factories加载出所有实现org.springframework.context.ApplicationContextInitializer初始化器,并且通过反射创建实例//Tomcat ---org.springframework.boot.web.servlet.support.ServletContextApplicationContextInitializersetInitializers((Collection) getSpringFactoriesInstances(ApplicationContextInitializer.class));//从spring.factories中org.springframework.context.ApplicationListener找到配置类,并且反射创建实例。setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));//确认入口类,通常是这种/* public static void main(String[] args) {** SpringApplication.run(DemoApplication.class, args);** }*/this.mainApplicationClass = deduceMainApplicationClass();
}
2、确认入口类之后,就是SpringApplication.run(XXXXApplication.class, args);的调用了。
/*** Run the Spring application, creating and refreshing a new* {@link ApplicationContext}.* @param args the application arguments (usually passed from a Java main method)* @return a running {@link ApplicationContext}*/public ConfigurableApplicationContext run(String... args) {StopWatch stopWatch = new StopWatch();stopWatch.start();ConfigurableApplicationContext context = null;FailureAnalyzers analyzers = null;configureHeadlessProperty();//获取应用运行监听器,并触发开始事件SpringApplicationRunListeners listeners = getRunListeners(args);listeners.starting();try {//创建应用参数对象ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);// 准备环境,包括配置文件和属性源ConfigurableEnvironment environment = prepareEnvironment(listeners,applicationArguments);//打印应用的 BannerBanner printedBanner = printBanner(environment);//获取当前ConfigurableApplicationContext应用上下文。context = createApplicationContext();//获取失败分析器analyzers = new FailureAnalyzers(context);// 准备上下文,包括加载 bean 定义prepareContext(context, environment, listeners, applicationArguments,printedBanner);//调用spring refresh 方法refreshContext(context);//refresh的后置处理afterRefresh(context, applicationArguments);//通知所有基于SpringApplicationRunListeners回调完成。listeners.finished(context, null);stopWatch.stop();if (this.logStartupInfo) {new StartupInfoLogger(this.mainApplicationClass).logStarted(getApplicationLog(), stopWatch);}return context;}catch (Throwable ex) {handleRunFailure(context, listeners, analyzers, ex);throw new IllegalStateException(ex);}}private void prepareContext(ConfigurableApplicationContext context,ConfigurableEnvironment environment, SpringApplicationRunListeners listeners,ApplicationArguments applicationArguments, Banner printedBanner) {//ConfigurableApplicationContext绑定一个environment,环境参数context.setEnvironment(environment);//2、application的后置处理postProcessApplicationContext(context);//3、ConfigurableApplicationContext绑定ApplicationContextInitializerapplyInitializers(context);//4、通知监听器ConfigurableApplicationContext准备工作已完成listeners.contextPrepared(context);if (this.logStartupInfo) {logStartupInfo(context.getParent() == null);logStartupProfileInfo(context);}// Add boot specific singleton beans//向ConfigurableApplicationContext添加特定的单例Beancontext.getBeanFactory().registerSingleton("springApplicationArguments",applicationArguments);if (printedBanner != null) {context.getBeanFactory().registerSingleton("springBootBanner", printedBanner);}// Load the sources//加载配置BeanSet<Object> sources = getSources();Assert.notEmpty(sources, "Sources must not be empty");//ConfigurableApplicationContext绑定配置Bean 并且转化为BD。load(context, sources.toArray(new Object[sources.size()]));//通知监听器ConfigurableApplicationContext加载完成listeners.contextLoaded(context);}