1. SpringApplication.run(StartClass.class,args);--->启动类main方法调用SpringApplication静态run方法
2. SpringApplication类中将资源文件装载到Object[] 数组中:我们传入的参数为 SpringApplication.class
public static ConfigurableApplicationContext run(Object source, String... args) { return run(new Object[] { source }, args); }
3.SpringApplication类的构造器初始化sources资源文件,然后调用run(args)启动方法;
public static ConfigurableApplicationContext run(Object[] sources, String[] args) { return new SpringApplication(sources).run(args);//利用构造器初始化资源文件,run方法运行启动流程 }
public SpringApplication(Object... sources) { initialize(sources);//初始化资源文件 }
private void initialize(Object[] sources) { if (sources != null && sources.length > 0) { //将数组元素赋值给sources集合 this.sources.addAll(Arrays.asList(sources));//this.sources是一个LinkedHashSet集合 } this.webEnvironment = deduceWebEnvironment();//通过是否包含 WEB_ENVIRONMENT_CLASSES 数组中的类判定是否是web应用程序(javax.servlet.Servlet,org.springframework.web.context.ConfigurableWebApplicationContext) setInitializers((Collection) getSpringFactoriesInstances( ApplicationContextInitializer.class));//初始化ApplicationContextInitializer setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));//初始化ApplicationListener this.mainApplicationClass = deduceMainApplicationClass();//获取mainApplicationClass对象实例 }
ApplicationContextInitializer初始化为7个对象集合:
0-ConfigurationWarningsApplicationContextInitializer:可以检查配置,在有常见错误配置时打印错误信息的BeanFactoryPostProcessor
1-ContextIdApplicationContextInitializer:为ApplicationContext设置Id
2-DelegatingApplicationContextInitializer:在context.initializer.classes中配置委托其他初始化器
3-ServerPortInfoApplicationContextInitializer:设置环境变量local.server.port以方便测试
4-SharedMetadataReaderFactoryContextInitializer:
5-AutoConfigurationReportLoggingInitializer:
6-RestartScopeInitializer:
ApplicationListener初始化为11个对象集合:
0-ClearCachesApplicationListener:加载上下文后清理缓存
1-ParentContextCloserApplicationListener:监听父ApplicationContext,如果父关闭,则关闭当前上下文
2-FileEncodingApplicationListener:监听系统文件编码与环境编码是否一致,不一致打印日志,启动终止
3-AnsiOutputApplicationListener:根据spring.output.ansi.enable配置ANSI输出
4-ConfigFileApplicationListener:搜索并加载配置文件,设置enviroment
5-DelegatingApplicationListener:加载并转发事件至context.listener.classes中配置的ApplicationListener
6-LiquibaseServiceLocatorApplicationListener:将liquibase.servicelocator.ServiceLocator替换成适用于springboot版本
7-ClasspathLoggingApplicationListener:程序启动日志打印,正常打印classpath到debug,失败打印到info
8-LoggingApplicationListener:根据配置在合适的时候初始化日志配置
9-BackgroundPreinitializer:
10-RestartApplicationListener:
mainApplicationClass
this.mainApplicationClass = deduceMainApplicationClass();private Class<?> deduceMainApplicationClass() { try { StackTraceElement[] stackTrace = new RuntimeException().getStackTrace();//获取当前调用栈 for (StackTraceElement stackTraceElement : stackTrace) { if ("main".equals(stackTraceElement.getMethodName())) {//找到main方法所在的启动类 return Class.forName(stackTraceElement.getClassName());//返回main方法所在类的对象实例 } } } catch (ClassNotFoundException ex) { // Swallow and continue } return null; }由此可初始化启动类,并且初始化设置ApplicationContextInitializer和ApplicationListener支撑程序后续的运行。