SpringApplication.run方法java
public static ConfigurableApplicationContext run(Object source, String... args) { return run(new Object[] { source }, args); } public static ConfigurableApplicationContext run(Object[] sources, String[] args) { return new SpringApplication(sources).run(args); }
进而可知又从新建立了个一个SpringApplication类后,执行run方法web
在建立SpringApplication这个类时候的用到了initialize方法spring
private void initialize(Object[] sources) { //判断传入的参数,有就做为数组保存起来 if (sources != null && sources.length > 0) { this.sources.addAll(Arrays.asList(sources)); } //测试是不是web环境 this.webEnvironment = deduceWebEnvironment(); //初始化spring.factories文件中对应的ApplicationContextInitializer实现类(四个) setInitializers((Collection) getSpringFactoriesInstances( ApplicationContextInitializer.class)); //初始化spring.factories文件中对应的ApplicationListener实现类(九个) setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class)); //经过当前堆栈找到入口main函数所在的类 this.mainApplicationClass = deduceMainApplicationClass(); }
而后运行新对象的run方法数组
public ConfigurableApplicationContext run(String... args) { //启动监视器,记录启动的时间等信息 StopWatch stopWatch = new StopWatch(); stopWatch.start(); ConfigurableApplicationContext context = null; FailureAnalyzers analyzers = null; //用来设置java.awt.headless 属性是true 仍是false, java.awt.headless是J2SE的一种模式用于在缺乏显示屏、键盘或者鼠标时的系统配置,不少监控工具如jconsole 须要将该值设置为true configureHeadlessProperty(); //根据spring.factories文件获取到SpringApplicationRunListeners 的实现类名org.springframework.boot.context.event.EventPublishingRunListener 实例化,他就是一个事件发布者,内部持有一个EventPublishingRunListener,真正发布是这个类 SpringApplicationRunListeners listeners = getRunListeners(args); //发布启动事件给各个监听器 listeners.starting(); try { ApplicationArguments applicationArguments = new DefaultApplicationArguments( args); ConfigurableEnvironment environment = prepareEnvironment(listeners, applicationArguments); Banner printedBanner = printBanner(environment); context = createApplicationContext(); analyzers = new FailureAnalyzers(context); prepareContext(context, environment, listeners, applicationArguments, printedBanner); refreshContext(context); afterRefresh(context, applicationArguments); 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); } }