2.new SpringApplication(primarySources)
2.1 资源加载器<br>this.resourceLoader = resourceLoader;<br>
2.2 主要资源,就是run传入的class<br>this.primarySources = new LinkedHashSet<>(Arrays.asList(primarySources));<br>
2.3 推测Web类型 this.webApplicationType = WebApplicationType.deduceFromClasspath();<br>
2.4 从spring.factories中获取BootstrapRegistryInitializer对象<br>this.bootstrapRegistryInitializers = new ArrayList<>(<br>getSpringFactoriesInstances(BootstrapRegistryInitializer.class));<br>
2.5 从spring.factories中获取ApplicationContextInitializer对象<br>setInitializers((Collection) getSpringFactoriesInstances(ApplicationContextInitializer.class));<br>
2.6 从spring.factories中获取ApplicationContextListener对象<br>setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));<br>
2.7 推测出main方法所在类<br>this.mainApplicationClass = deduceMainApplicationClass();<br>
3.SpringApplication->run(args)
3.1 获取bootstrap上下文,定义Spring上下文,设置headless属性<br>DefaultBootstrapContext bootstrapContext = createBootstrapContext();<br>ConfigurableApplicationContext context = null;<br>configureHeadlessProperty();<br>
3.2 初始化运行监听器<br>SpringApplicationRunListeners listeners = getRunListeners(args);<br>
3.3 触发运行监听器的starting方法<br>listeners.starting(bootstrapContext, this.mainApplicationClass);<br>
3.4 run args封装为一个对象<br>ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);<br>
3.5 环境变量准备,并触发运行监听器的prepareEnvironment方法;配置忽略的Bean配置信息;打印环境变量<br>ConfigurableEnvironment environment = prepareEnvironment(listeners, bootstrapContext, applicationArguments);<br>configureIgnoreBeanInfo(environment);<br>Banner printedBanner = printBanner(environment);<br>
3.6 创建Spring容器,准备上下文容器,并触发运行监听器的prepareEnvironment<br>context = createApplicationContext();<br>context.setApplicationStartup(this.applicationStartup); <br>
3.7 准备Spring容器<br>prepareContext(bootstrapContext, context, environment, listeners, applicationArguments, printedBanner);<br>
context.setEnvironment(environment);<br>postProcessApplicationContext(context);<br>
调用初始化器<br>applyInitializers(context);<br>
触发运行监听器的contextPrepared<br>listeners.contextPrepared(context);<br>
// 添加特殊的引导Bean<br> ConfigurableListableBeanFactory beanFactory = context.getBeanFactory();<br> beanFactory.registerSingleton("springApplicationArguments", applicationArguments);<br> if (printedBanner != null) {<br> beanFactory.registerSingleton("springBootBanner", printedBanner);<br> }<br> if (beanFactory instanceof AbstractAutowireCapableBeanFactory) {<br> ((AbstractAutowireCapableBeanFactory) beanFactory).setAllowCircularReferences(this.allowCircularReferences);<br> if (beanFactory instanceof DefaultListableBeanFactory) {<br> ((DefaultListableBeanFactory) beanFactory)<br> .setAllowBeanDefinitionOverriding(this.allowBeanDefinitionOverriding);<br> }<br> }<br> if (this.lazyInitialization) {<br> context.addBeanFactoryPostProcessor(new LazyInitializationBeanFactoryPostProcessor());<br> }<br>
// 加载资源<br> Set<Object> sources = getAllSources();<br> Assert.notEmpty(sources, "Sources must not be empty");<br> load(context, sources.toArray(new Object[0]));
触发运行监听器的contextLoaded<br>listeners.contextLoaded(context);<br>
3.8 刷新Spring容器<br>refreshContext(context);<br>
刷新Spring容器
解析配置类
扫描
启动WebServer
3.9 打印初始化时长,除法运行监听器started方法<br> Duration timeTakenToStartup = Duration.ofNanos(System.nanoTime() - startTime);<br> if (this.logStartupInfo) {<br> new StartupInfoLogger(this.mainApplicationClass).logStarted(getApplicationLog(), timeTakenToStartup);<br> }<br> listeners.started(context, timeTakenToStartup);<br>
3.10 callRunners
执行容器中ApplicationRunner,<br>
执行容器中CommandLineRunner