运行Application,创建、刷新一个新的 ApplicationContext
/**
* Static helper that can be used to run a {@link SpringApplication} from the
* specified sources using default settings and user supplied arguments.
* @param primarySources the primary sources to load
* @param args the application arguments (usually passed from a Java main method)
* @return the running {@link ApplicationContext}
*/
public static ConfigurableApplicationContext run (Class <?>[] primarySources ,
String [] args ) {
return new SpringApplication (primarySources ).run (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 ();
// ApplicationContext子接口
ConfigurableApplicationContext context = null ;
// 异常记录
Collection <SpringBootExceptionReporter > exceptionReporters = new ArrayList <>();
// 配置java.awt.headless模式
configureHeadlessProperty ();
// 获取SpringApplication运行监听器
SpringApplicationRunListeners listeners = getRunListeners (args );
listeners .starting ();
try {
ApplicationArguments applicationArguments = new DefaultApplicationArguments (
args );
ConfigurableEnvironment environment = prepareEnvironment (listeners ,
applicationArguments );
configureIgnoreBeanInfo (environment );
Banner printedBanner = printBanner (environment );
context = createApplicationContext ();
exceptionReporters = getSpringFactoriesInstances (
SpringBootExceptionReporter .class ,
new Class [] { ConfigurableApplicationContext .class }, context );
prepareContext (context , environment , listeners , applicationArguments ,
printedBanner );
refreshContext (context );
afterRefresh (context , applicationArguments );
stopWatch .stop ();
if (this .logStartupInfo ) {
new StartupInfoLogger (this .mainApplicationClass )
.logStarted (getApplicationLog (), stopWatch );
}
listeners .started (context );
callRunners (context , applicationArguments );
}
catch (Throwable ex ) {
handleRunFailure (context , ex , exceptionReporters , listeners );
throw new IllegalStateException (ex );
}
try {
listeners .running (context );
}
catch (Throwable ex ) {
handleRunFailure (context , ex , exceptionReporters , null );
throw new IllegalStateException (ex );
}
return context ;
}